你会怎么做相当于预处理指令在蟒蛇?
-
20-08-2019 - |
题
有没有办法做到以下预处理指令在蟒蛇?
#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__
将与由编译器的常数0或1代替,并且被解释源之前,优化器将删除任何if 0:
线。
其他提示
我写了一个Python预处理称为pypreprocessor,做你所描述的到底是什么。
包装还可以下载/通过的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能够不仅仅是上即时预处理多得多。要看到更多的使用案例检查出谷歌代码项目。
<强>更新:对更多信息pypreprocessor 强>
我完成预处理的方式是简单的。从上面的例子中,预处理器出口是这样的pypreprocessor模块中创建一个对象pypreprocessor。当你调用预处理器解析它()自我消耗,它被导入并产生其自身的临时副本注释掉所有的预处理器代码的文件(以避免预处理器的递归调用自身无限循环)和评论的所有未使用的部分。
注释的行数是,相对于去除它们,有必要对误差回溯保全行号,如果模块抛出异常或崩溃。而且我甚至去尽可能重写错误追踪报告反映崩溃的模块的正确的文件名。
然后,对即时执行包含后处理代码所生成的文件。
在颠倒使用这种方法比只加入一些if语句内联代码的,会有浪费无用的评估没有语句的执行时间,因为代码的注释部分将从编译pyc文件被排除
缺点(和我当初之所以创建模块)是因为蟒蛇解释执行的代码之前运行一个完整的语法检查不能运行在同一个文件中蟒2倍和3倍蟒,将拒绝任何特定版本预处理程序代码之前允许运行::叹息::。我最初的目标是能够开发出2倍和3倍代码并排侧,将取决于它在运行上创建特定版本的字节码相同的文件。
无论哪种方式,预处理器模块仍然是用于实施共同c样式预处理功能非常有用的。以及,预处理器能够如果希望后处理代码输出到文件以供以后使用的。
另外,如果你想生成具有所有预处理器指令以及任何被排除删除这就像调用解析前设置预处理器中的代码标志一样简单的#ifdefs的版本()。这使得从一个版本特定源文件中删除不需要的代码一步法(VS通过代码爬行和除去if语句手动地)。
我怀疑你会讨厌这个答案。你这样做,在Python的方式是
# code here
if DEBUG:
#debugging code goes here
else:
# other code here.
因为Python是一个解释器,没有预处理步骤要被施加,并没有特别的优势,以具有特殊的语法。
可以使用在Python预处理器。只需在您的bin目录中运行通过CPP(C-预处理器)脚本。但是我已经和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脚本注释掉其是仅于调试相关的代码部分。以下是评论的是,在它“#调试”语句行一个示例脚本。它也可以再次删除这些注释标记。
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
- 蟒蛇如果不能消除元素从阵列。
- C precompilers不处理#!或其他的线路的开始#需要。
- pypreprocessor似乎是特定的蟒蛇
使用共同的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=True-D M4_OS=安卓-D M4_CPU=臂测试。py。m4>test.py