python中的条件编译

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。

  • Python代码是字节编译成像Java那样的中间形式,但是通常没有单独的编译步骤。以.py结尾的"原始"源文件是可执行的。

  • 实际上有一种获得条件编译的方法,但是它非常有限。

    1
    2
    if __debug__:
        doSomething()

    EDCOX1×1的标志是一种特殊情况。当调用具有EDOCX1×2或EDCOX1×3选项的Python时,EDCOX1×1 }将是错误的,编译器将忽略该语句。这主要是用断言,这就是为什么如果你真的用优化来编译脚本的话,断言就消失了。

    因此,如果您的目标是添加调试代码,但是防止调试速度减慢或影响到"发布"构建,那么这将实现您想要的。但您不能将值赋给__debug__,所以这就是您可以使用它的全部目的。


    使用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的作者

    更新:

    我以前忘了提。与其他答案中描述的if/elseif _debug:方法不同,这是一个真正的预处理器。生成的字节码将不包含有条件排除的代码。


    当您导入模块时,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预处理器运行它,您将得到真正的条件编译,并且只有在定义了SOME_CONDITION时,才会定义some_function

    但是(这很重要):条件编译可能不是您想要的。记住,当导入模块时,python只执行其中的代码。模块中的def和class语句实际上是在导入模块时执行的。因此,实现其他语言将使用条件编译的典型方法只是一个普通的if语句,比如:

    1
    2
    3
    if some_condition:
      def some_function():
        pass

    这仅在SOME_CONDITION为真时定义some_function

    正是这样的东西使得动态语言如此强大,同时概念上保持简单。


    在动态环境中没有多大意义。如果要查找函数的条件定义,可以使用if

    1
    2
    3
    if happy:
        def makemehappy():
            return"I'm good"


    您可以使用这里讨论的方法:确定是否在python中定义变量来代替#ifdef