Python中的条件编译

时间:2009-02-18 06:26:54

标签: python conditional-compilation

如何在Python中进行条件编译?

是否使用DEF?

6 个答案:

答案 0 :(得分:22)

Python的编译方式与C或C ++甚至Java不同,python文件是“即时”编译的,您可以将其视为类似于Basic或Perl等解释语言。 1

只需使用if语句,就可以执行与条件编译等效的操作。例如:

if FLAG:
    def f():
        print "Flag is set"
else:
    def f():
        print "Flag is not set"

您可以对创建类,变量设置以及几乎所有内容执行相同的操作。

最接近模仿IFDEF的方法是使用hasattr函数。 E.g:

if hasattr(aModule, 'FLAG'):
    # do stuff if FLAG is defined in the current module.

您也可以使用try / except子句来捕获名称错误,但惯用的方法是在脚本顶部将变量设置为None。

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

答案 1 :(得分:17)

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

if __debug__:
    doSomething()

__debug__标志是一种特殊情况。使用-O-OO选项调用python时,__debug__将为false,编译器将忽略该语句。这主要用于断言,这就是为什么如果你真的用优化编译你的脚本,断言就会消失。

因此,如果您的目标是添加调试代码,但防止它减慢速度或以其他方式影响“发布”版本,这可以满足您的需求。但是你不能为__debug__分配一个值,所以你可以用它来做所有的事情。

答案 2 :(得分:12)

使用pypreprocessor

也可以在PYPI (Python Package Index)找到,也可以使用pip获取。

使用的基本例子是:

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

您还可以通过指定...

将后处理代码输出到文件
pypreprocessor.output = 'output_file_name.py'

在pypreprocessor导入和对parse()的调用之间的任何地方。

该模块本质上是C预处理器条件编译的python实现。

SideNote:这与python2x和python 3k兼容

免责声明:我是pypreprocessor的作者

<强>更新

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

答案 3 :(得分:4)

Python在导入时自动编译模块,因此避免编译模块的唯一方法是不导入它。你可以这样写:

if some_condition:
  import some_module

但这只适用于完整的模块。在C和C ++中,您通常使用预处理器进行条件编译。没有什么可以阻止您在Python代码上使用预处理器,因此您可以编写如下内容:

#ifdef SOME_CONDITION
def some_function():
  pass
#endif

通过C预处理器运行它,您将获得真正的条件编译,只有在定义some_function时才会定义SOME_CONDITION

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

if some_condition:
  def some_function():
    pass

如果some_function为真,则只定义some_condition

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:0)

您可以使用此处讨论的方法:Determine if variable is defined in Python替代#ifdef