你会如何在Python中执行等效的预处理程序指令?

时间:2009-01-27 01:10:44

标签: python preprocessor equivalent directive

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

#if DEBUG

< do some code >

#else

< do some other code >

#endif

7 个答案:

答案 0 :(得分:98)

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

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

__debug__将被编译器替换为常量0或1,优化器将在解释源代码之前删除任何if 0:行。

答案 1 :(得分:32)

我编写了一个名为pypreprocessor的python预处理器,它完全符合您的描述。

The source and documentation is available on GitHub

The package can also be downloaded/installed through the 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

pypreprocessor不仅可以进行实时预处理。要查看更多用例示例,请查看Google Code上的项目。

更新:有关pypreprocessor的更多信息

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

如果模块抛出异常或崩溃,则注释掉这些行与删除它们相反,必须保留错误回溯上的行号。而且我甚至已经将错误回溯重写为报告,反映了崩溃模块的正确文件名。

然后,包含后处理代码的生成文件将在运行中执行。

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

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

无论哪种方式,预处理器模块对于实现常见的c样式预处理功能仍然非常有用。同样,预处理器能够将后处理代码输出到文件中以供以后使用。

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

答案 2 :(得分:22)

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

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

由于python是一个解释器,因此没有要应用的预处理步骤,并且没有特殊的优势来获得特殊的语法。

答案 3 :(得分:10)

您可以在Python中使用预处理器。只需通过bin目录中的cpp(C-Preprocessor)运行脚本即可。不过我已经用Lua完成了这个并且简单解释的好处超过了更复杂的编译恕我直言。

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

另一种方法是使用bash脚本注释掉仅与调试相关的代码部分。下面是一个示例脚本,用于注释其中包含“#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

答案 6 :(得分:0)

  • Python无法消除数组中的元素。
  • C预编译器不处理#!或其他以#开头的行。
  • pypreprocessor似乎是特定于python的

改为使用通用的m4,如下所示:

ifelse(DEBUG,True,dnl`
  < do some code >
dnl,dnl`
  < do some other code >dnl
')

ifelse(
  M4_CPU,x86_64,`
    < do some code specific for M4_CPU >
',M4_CPU,arm,`
    < do some code specific for M4_CPU >
',M4_CPU,ppc64le,`
    < do some code specific for M4_CPU >
')

ifelse(
  M4_OS,windows,`
    < do some code specific for M4_OS >
  ',M4_OS,linux,`
    < do some code specific for M4_OS >
  ',M4_OS,android,`
    < do some code specific for M4_OS >
')
  

m4 -D DEBUG =真-D M4_OS = android -D M4_CPU = arm test.py.m4> test.py