python中的条件编译

Conditional compilation in python

嗨,我正试图在Python中实现类似于C中的条件编译,我已经看到了这个线程和这个线程。

但这不起作用。我对python比较陌生,我们如何修复它?


codeforces.com(链接在注释中)调用python脚本作为python -O %s。您可以通过__debug__在脚本中检测到它。比较:

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,判断机提供一个参数-D ONLINE_JUDGE。这与在代码中具有以下效果相同:

1
#define ONLINE_JUDGE

python没有预处理器。因此,在调用解释器时,无论是在代码中还是从命令行中,都无法定义宏(在C中的意义相同)。所以,我认为在线法官不太可能为python提供类似的选择。但它可能提供一些命令行参数,您可以通过sys.argv[1:]使用这些参数。检查用于调用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的作者