Conditional compilation in python
嗨,我正试图在Python中实现类似于C中的条件编译,我已经看到了这个线程和这个线程。
但这不起作用。我对python比较陌生,我们如何修复它?
codeforces.com(链接在注释中)调用python脚本作为
1 2 | $ python -c 'print __debug__' True |
和
1 2 | $ python -O -c 'print __debug__' False |
所以你可以在你的脚本中写:
1 2 3 4 | ONLINE_JUDGE = not __debug__ # ... if ONLINE_JUDGE: pass # here goes online judge specific stuff |
看起来你是想用这个向在线法官提交解决方案。对于GCC,判断机提供一个参数
1 | #define ONLINE_JUDGE |
python没有预处理器。因此,在调用解释器时,无论是在代码中还是从命令行中,都无法定义宏(在C中的意义相同)。所以,我认为在线法官不太可能为python提供类似的选择。但它可能提供一些命令行参数,您可以通过
您需要定义在线_judge变量-这是一个"if",而不是一个"ifdef"。
1 2 3 | ONLINE_JUDGE = 0 if ONLINE_JUDGE: import math |
对我来说有点太重了。这个怎么样:
1 2 3 | import sys try: fin = open('Problem.in') except: fin = sys.stdin |
从本质上说,它是通用的,而且非常方便。二合一。
使用pypreprocessor
也可以在pypi(python包索引)中找到,这样就可以使用pip加载它。
您的具体示例如下:
1 2 3 4 5 6 7 8 | from pypreprocessor import pypreprocessor pypreprocessor.parse() #define onlinejudge #ifdef onlinejudge import math #endif |
通过命令行添加define也很容易完成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import sys from pypreprocessor import pypreprocessor #exclude # defined if 'mode' is found in the command line arguments if 'mode1' in sys.argv: pypreprocessor.defines.append('mode1') # defined if 'mode2' is found in the command line arguments if 'mode2' in sys.argv: pypreprocessor.defines.append('mode2') #endexclude pypreprocessor.parse() #ifdef mode1 print('this script is running in mode1') #ifdef mode2 print('this script is running in mode2') #else print('no modes specified') #endif |
下面是输出应该产生的结果…
'python prog.py mode1':
this script is running in mode1
'python prog.py mode2':
this script is running in mode2
'python prog.py mode1 mode2':
this script is running in mode1
this script is running in mode2
'python prog.py':
no modes specified
旁注:pypreprocessor同时支持python2x和python3k。
免责声明:我是pypreprocessor的作者