我想维护一个代码库,可以在其中动态启用和禁用不同构建版本的一组功能。当然,我可以使用 C/C++ 中的编译器标志来完成此操作,同时具有多个构建配置。但我怎样才能用 Python 做到这一点呢? Python中有类似的技术吗?
最佳答案
当然,在 C 语言中,预处理器用于确定程序的哪些部分被包含或排除。预处理器和主程序代码之间有严格的划分。
Python 中没有预处理器,因此没有这样的描述,这对于 C 程序员来说可能看起来很奇怪。但仅仅因为没有这样的划分并不意味着您无法重新配置您的应用程序。
Python 非常动态——Python 的优点之一是,应用程序甚至可以通过读取特殊格式的配置文件(标准库支持几种格式)来“即时”重新配置应用程序,甚至用Python。有多种高级方法可以重新配置应用程序,但最简单的可能是使用纯 Python 的配置文件。例如,您可以有一个 myconfig.py
,其中包含如下语句:
use_widgets = True
use_cogs = False
此 Python 配置脚本甚至可以存在于用户执行程序的位置;通过将当前目录添加到模块搜索路径可以轻松支持此行为:
import sys
sys.path.insert(0, '.')
import myconfig
如您所知,在 C 中,#if
比 if
更高效,因为结果是在执行之前预先计算好的。 Python 没有 #if
,但与 C 不同,if
语句可以轻松存在于任何函数之外,因此您可以根据您的配置替换整个代码部分:
if myconfig.use_widgets:
def myfunc(.....):
<definition that uses widgets>
else:
def myfunc(.....):
<non-widget definition>
导入模块时,Python 将编译整个内容(如果尚未预编译为 .pyc 文件),然后执行模块的主体。此执行会将第一个模块定义(对于使用 myfunc
的小部件)绑定(bind)到模块全局变量中的标识符 myfunc
,并立即丢弃非小部件 myfunc
(通过不执行 else
子句)。
这在启动时比使用单个 myfunc
效率稍低,但启动后,没有运行时损失 - 第二个 myfunc 消失并且再也不会出现,而第一个 myfunc ,针对您拥有小部件的情况进行了优化,每当程序的另一部分调用 myfunc
时就会执行。
关于c++ - Python 中 C++ 编译器标志的等效功能是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846002/