你将如何做相当于Python中的预处理器指令?

有没有办法在Python中执行以下预处理器指令?

#if DEBUG < do some code > #else < do some other code > #endif 

__debug__ ,这是编译器预处理的特殊值。

 if __debug__: print "If this prints, you're not running python -O." else: print "If this prints, you are running python -O!" 

__debug__将被编译器replace为常量0或1,优化程序将在解释源之前删除任何( if 0:行。

我写了一个名为pypreprocessor的python预处理程序,它完全符合你所描述的内容。

源代码和文档可在Google Code上find 。

该软件包也可以通过PYPI下载/安装 。

这里有一个例子来完成你所描述的内容。

 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 

重处理器不仅仅是即时预处理。 要查看更多用例,请查看Google代码上的项目。

更新:关于pypreprocessor的更多信息

我完成预处理的方式很简单。 从上面的示例中,预处理器将导入在pypreprocessor模块中创build的pypreprocessor对象。 当您在预处理器上调用parse()时,它会自动使用它所导入的文件,并生成一个临时副本,用于注释所有预处理器代码(以避免预处理器在无限循环中recursion调用)以及注释掉所有未使用的部分。

注释掉行,而不是删除它们,如果模块抛出exception或崩溃,则必须保留错误回溯的行号。 而且我已经甚至去重写错误回溯报告反映崩溃的模块的正确的文件名。

然后,包含后处理代码的生成文件即时执行。

使用这种方法的好处是只需在代码中添加一堆if语句,就不会浪费执行时间来评估无用语句,因为代码的注释部分将从编译后的.pyc文件中排除。

不利的一面(和我创build模块的原因)是你不能在同一个文件中同时运行python 2x和python 3x,因为pythons解释器在执行代码之前运行了一个完整的语法检查,并且会拒绝任何版本特定的代码预处理器被允许运行:: sigh ::。 我最初的目标是能够在同一个文件中并行开发2X和3X代码,根据运行的内容创build特定于版本的字节码。

不pipe怎样,预处理器模块对于实现通用的c样式预处理function仍然非常有用。 以及,预处理器能够将后处理的代码输出到文件以供稍后使用。

另外,如果要生成一个包含所有预处理器指令的版本以及排除的任何#ifdef,则只需在调用parse()之前在预处理器代码中设置一个标志即可。 这使得从一个版本特定的源文件中删除不需要的代码是一个一步的过程(vs通过代码爬行和手动删除if语句)。

我怀疑你会讨厌这个答案。 你在Python中的做法是

 # code here if DEBUG: #debugging code goes here else: # other code here. 

由于python是一个解释器,所以不需要预处理步骤,并且没有特别的优势来使用特殊的语法。

你可以在Python中使用预处理器。 只需通过bin目录中的cpp(C-Preprocessor)运行脚本。 然而,我已经用Lua做了这个,易于解释的好处已经超过了更复杂的编译恕我直言。

你可以使用正常的语言结构:

 DEBUG = True if DEBUG: # Define a function, a class or do some crazy stuff def f(): return 23 else: def f(): return 42 

另一种方法是使用bash脚本来注释仅与debugging相关的部分代码。 下面是一个示例脚本,它注释了其中包含“#DEBUG”语句的行。 它也可以再次删除这些评论标记。

 if [ "$1" == "off" ]; then sed -e '/^#/! {/#DEBUG/ s/^/#/}' -i *.py echo "Debug mode to $1" elif [ "$1" == "on" ]; then sed -e '/#DEBUG/ s/^#//' -i *.py echo "Debug mode to $1" else echo "usage: $0 on | off" fi