Python 中 C++ 编译器标志的等效功能是什么?

what's the equivalent feature of C++ compiler flags in Python?

我想维护一个代码库,我可以在其中动态启用和禁用不同构建版本的一些功能集。当然,我可以在 C/C++ 中使用编译器标志来完成此操作,同时具有多个构建配置。但是我怎样才能用 Python 做到这一点呢? Python中是否有任何等效技术?

当然,在 C 中,预处理器用于确定包含或排除程序的哪些部分。预处理器和主程序代码之间存在硬性划分。

没有预处理器,因此 Python 中没有这样的描述,这对 C 程序员来说可能看起来很奇怪。但仅仅因为没有这样的描述并不意味着您不能重新配置您的应用程序。

Python 非常动态——Python 的好处之一是应用程序甚至可以通过读取特定格式的配置文件来重新配置 "on the fly" (标准库支持几个),甚至 Python.

有重新配置应用程序的高级方法,但最简单的方法可能是拥有一个纯配置文件 Python。例如,您可以有一个 myconfig.py,其中包含如下语句:

use_widgets = True
use_cogs = False

这个Python配置脚本甚至可以存在于用户执行程序的地方;通过将当前目录添加到模块搜索路径,可以轻松支持此行为:

import sys
sys.path.insert(0, '.')
import myconfig

如您所知,在 C 中,#ifif 更有效,因为结果是在执行前预先计算的。 Python 没有 #if,但与 C 不同,if 语句可以很容易地存在于任何函数之外,因此您可以根据您的配置替换整个代码段:

if myconfig.use_widgets:

    def myfunc(.....):
       <definition that uses widgets>

else:

    def myfunc(.....):
       <non-widget definition>

导入模块时,Python 将编译整个模块(如果尚未预编译为 .pyc 文件),然后执行模块主体。此执行会将第一个模块定义(对于使用小部件的myfunc)绑定到模块全局变量中的标识符myfunc,并立即丢弃非小部件myfunc(通过不执行else 子句)。

这在启动时比使用单个 myfunc 效率稍低,但在启动后,没有 运行 时间惩罚——第二个 myfunc 消失并且再也见不到,并且第一个 myfunc,针对你有小部件的情况进行了优化,是程序的另一部分调用时执行的那个 myfunc.