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

时间:2015-08-06 02:46:16

标签: c++ python-2.7 compiler-flags

我想维护一个代码库,我可以为不同的构建版本动态启用和禁用某些功能集。当然,我可以使用C / C ++中的编译器标志执行此操作,同时具有多个构建配置。但是我怎么能用Python做到这一点? Python中有没有相同的技术?

1 个答案:

答案 0 :(得分:1)

当然,在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中,#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时执行的小工具。