Python 3.x 什么';这是“什么?”;“最佳”;如果运行Python3,如何确保模块被导入?
我有一个模块,特别是Python3。如果有人试图在Python2中导入它,那么最好的方法是什么,以确保它会引发某种异常 现在我有:Python 3.x 什么';这是“什么?”;“最佳”;如果运行Python3,如何确保模块被导入?,python-3.x,Python 3.x,我有一个模块,特别是Python3。如果有人试图在Python2中导入它,那么最好的方法是什么,以确保它会引发某种异常 现在我有: # all my imports that I need, ex: import sys # blow up if not python 3 if sys.version_info.major < 3: sys.exit("This is not Python 3") #我需要的所有导入,例如: 导入系统 #如果不是python 3,就炸掉它 如果
# all my imports that I need, ex:
import sys
# blow up if not python 3
if sys.version_info.major < 3:
sys.exit("This is not Python 3")
#我需要的所有导入,例如:
导入系统
#如果不是python 3,就炸掉它
如果sys.version_info.major<3:
sys.exit(“这不是Python 3”)
但是我真的不喜欢额外的导入(如果我的模块不需要sys,它必须导入它以进行版本检查),而且这感觉不太“正确”。有更好/更具自动化的方法吗?不要sys.exit,它会让其他开发人员想当面捅你一刀
您只需抛出一个
ImportError
或一些Py3kCompatible
错误。ImportError将完成这项工作,但如果您使用外部库,这将是一个问题。如果范围(0)=[]:raise RUNTIMERROR('此代码需要Python 3')
这可能是我能想到的最快的测试和最好的例外情况。我能想到的唯一一件事就是专门测试一种已经改变的语言功能:
try:
lambda: print()
except SyntaxError:
raise ImportError('This code requires Python 3')
(尽管需要重新学习print
,但我非常喜欢新函数语法允许在lambdas中使用)
请注意,这段代码实际上不会在python3中调用print,它只返回一个函数,如果您调用它,该函数将调用print,但它只是被丢弃而不是被调用,因此通过运行此测试,您不会在STDOUT上得到草率的换行符。“如果您使用的是外部库,那么这将是一个问题”--是否要详细说明?您确定,亚当?在Python2.7.3中,
range(0)
返回[]
,但在Python3.2.3中,它返回range(0,0)
,因此上述测试只在2.7中成功地引发了运行时错误,至少对我来说不是在3.2中。新的打印也在Python2.7中,所以这不会很有效。另外,实际上,您似乎无法捕捉到SyntaxerError,因此这一点都不是很好;-)