conditional evaluation of source file in python
假设我有一个只在预生产代码中使用的文件
我想确保它不会在生产代码中运行——任何对它的调用都必须失败。
文件顶部的这段代码不起作用——它破坏了python语法,该语法指定
1 2 | if not __debug__: return None |
这里最好的解决方案是什么——不涉及制造一个巨大的其他的,也就是说。-)
1 2 | if not __debug__: raise RuntimeError('This module must not be run in production code.') |
可以将非生产代码拆分为一个模块,该模块是从主代码有条件地导入的?
1 2 3 | if __debug__: import non_production non_production.main() |
更新:根据您的评论,您可能需要查找第三方库pypreprocessor,它允许您在python中执行C样式的预处理器指令。它们提供了一个调试示例,看起来非常接近您要查找的内容(忽略内联调试代码而不需要缩进)。
从该URL复制/粘贴:
1 2 3 4 5 6 7 8 9 | 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 |
一种方法是将该模块中的所有内容隐藏在另一个按条件导入的模块中。
1 2 3 4 | . ├── main.py ├── _test.py ├── test.py |
MY.PY:
1 2 | import test print dir(test) |
测试:PY:
1 2 | if __debug__: from _test import * |
Py:
1 2 | a = 1 b = 2 |
编辑:
刚刚在另一个回答中认识到你的评论,你说"我希望避免为相当于一个ifdef的文件创建两个不同的文件"。如另一个答案所示,如果没有if语句,就没有任何方法可以做你想要做的事情。
我已经用samplebias对答案进行了升级,因为我认为这个答案(加上edit)描述了在不使用if语句的情况下你能得到的最接近的答案。
1 2 3 4 | import sys if not __debug__: sys.exit() |