如何在Python中实现类似C预处理器的条件解释功能以兼容2.7和3.x
Python跨2.7/3版本的条件兼容解决方案
报错原因
Python解释器执行代码前会先对整个文件做全量语法校验,不存在C语言预编译阶段的代码裁剪逻辑,所以即使if分支永远不会被执行,分支内不符合当前版本语法规则的代码也会在语法校验阶段触发SyntaxError,不会等到运行时判断分支逻辑再跳过。
可行解决方案
方案1:使用__future__统一print语法(最优解,仅针对print兼容场景)
直接在Python文件的第一行有效代码位置导入print_function,可以让Python 2.7的print语句完全兼容Python 3的函数式写法,无需任何条件判断:
from __future__ import print_function # 全版本通用写法 print("init message")
方案2:动态导入分版本兼容模块(适合多语法差异场景)
把不同版本的兼容代码拆分到独立模块中,运行时根据Python版本动态导入对应模块,解释器只会解析被导入模块的代码,不会校验未被导入的模块内容:
- 新建
py3_compat.py:
def print_msg(content): print(content)
- 新建
py2_compat.py:
def print_msg(content): print content
- 主代码中调用:
import sys if sys.version_info.major == 3: from py3_compat import print_msg else: from py2_compat import print_msg print_msg("init message")
方案3:用exec执行动态代码(适合少量差异代码场景)
exec传入的字符串内容只会在运行到对应语句时才做语法解析,不会参与全局语法校验:
import sys if sys.version_info.major == 3: exec('print("init message")') else: exec('print "init message"')
该方案仅适合少量差异代码的场景,大量使用会降低代码可读性和可维护性。
内容的提问来源于stack exchange,提问作者Cris6556
相关产品推荐
相关产品推荐

