python中源文件的条件评估

conditional evaluation of source file in python

假设我有一个只在预生产代码中使用的文件

我想确保它不会在生产代码中运行——任何对它的调用都必须失败。

文件顶部的这段代码不起作用——它破坏了python语法,该语法指定return必须在函数中发生。

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()

sys.exit文件。