19

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

它使用 DEF 吗?

4

6 回答 6

23

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 函数。例如:

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

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

  1. Python 代码被字节编译成像 Java 这样的中间形式,但是通常没有单独的编译步骤。以 .py 结尾的“原始”源文件是可执行的。
于 2009-02-18T06:30:22.567 回答
21

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

if __debug__:
    doSomething()

__debug__标志是一种特殊情况。当使用-Oor-OO选项调用 python 时,__debug__将为 false,编译器将忽略该语句。这主要与断言一起使用,这就是为什么如果您“真正编译”带有优化的脚本,断言就会消失的原因。

因此,如果您的目标是添加调试代码,但要防止它减慢或以其他方式影响“发布”构建,那么这就是您想要的。但是您不能为 分配值__debug__,所以这就是您可以使用它的全部内容。

于 2009-02-18T14:47:12.043 回答
17

使用pypreprocessor

这也可以在PYPI(Python 包索引)上找到,并且可以使用 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实现。

旁注:这与 python2x 和 python 3k 兼容

免责声明:我是 pypreprocessor 的作者

更新:

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

于 2011-03-16T02:53:03.407 回答
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为真。

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

于 2009-02-18T22:43:46.173 回答
3

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

if happy:
    def makemehappy():
        return "I'm good"
于 2009-02-18T06:31:23.967 回答
0

您可以使用此处讨论的方法:确定变量是否在 Python 中定义为替代#ifdef

于 2011-06-21T04:16:17.080 回答