Conditional compilation in Python
如何在Python中进行条件编译?
是否使用DEF?
Python不是用C或C++或Java来编译的,Python文件是"即时编译"的,你可以把它看作是类似于Basic或Perl的解释性语言。< Super> 1
只需使用if语句,就可以执行与条件编译等效的操作。例如:
1 2 3 4 5 6 | if FLAG: def f(): print"Flag is set" else: def f(): print"Flag is not set" |
对于创建类、变量设置和几乎所有的事情,您都可以这样做。
模拟ifdef的最接近方法是使用hasattr函数。例如。:
1 2 | if hasattr(aModule, 'FLAG'): # do stuff if FLAG is defined in the current module. |
您也可以使用try/except子句来捕获名称错误,但惯用的方法是在脚本顶部将变量设置为none。
实际上有一种获得条件编译的方法,但是它非常有限。
1 2 | if __debug__: doSomething() |
EDCOX1×1的标志是一种特殊情况。当调用具有EDOCX1×2或EDCOX1×3选项的Python时,EDCOX1×1 }将是错误的,编译器将忽略该语句。这主要是用断言,这就是为什么如果你真的用优化来编译脚本的话,断言就消失了。
因此,如果您的目标是添加调试代码,但是防止调试速度减慢或影响到"发布"构建,那么这将实现您想要的。但您不能将值赋给
使用pypreprocessor
它也可以在pypi(python包索引)上找到,并且可以使用pip获取。
使用的基本示例是:
1 2 3 4 5 6 7 8 9 10 11 | from pypreprocessor import pypreprocessor pypreprocessor.parse() #define debug #ifdef debug print('The source is in debug mode') #else print('The source is not in debug mode') #endif |
还可以通过指定…
1 | pypreprocessor.output = 'output_file_name.py' |
pypreprocessor导入和parse()调用之间的任意位置。
该模块本质上是C预处理器条件编译的python实现。
旁注:这与python2x和python 3k都兼容
免责声明:我是pypreprocessor的作者
更新:
我以前忘了提。与其他答案中描述的
当您导入模块时,python会自动编译它,所以避免编译它的唯一方法就是不要导入它。你可以写一些像:
1 2 | if some_condition: import some_module |
但这只适用于完整的模块。在C和C++中,通常使用条件编译的预处理器。没有什么能阻止您在Python代码上使用预处理器,因此您可以编写如下内容:
1 2 3 4 | #ifdef SOME_CONDITION def some_function(): pass #endif |
通过C预处理器运行它,您将得到真正的条件编译,并且只有在定义了
但是(这很重要):条件编译可能不是您想要的。记住,当导入模块时,python只执行其中的代码。模块中的def和class语句实际上是在导入模块时执行的。因此,实现其他语言将使用条件编译的典型方法只是一个普通的if语句,比如:
1 2 3 | if some_condition: def some_function(): pass |
这仅在
正是这样的东西使得动态语言如此强大,同时概念上保持简单。
在动态环境中没有多大意义。如果要查找函数的条件定义,可以使用
1 2 3 | if happy: def makemehappy(): return"I'm good" |
您可以使用这里讨论的方法:确定是否在python中定义变量来代替