Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 什么';这是“什么?”;“最佳”;如果运行Python3,如何确保模块被导入?_Python 3.x - Fatal编程技术网

Python 3.x 什么';这是“什么?”;“最佳”;如果运行Python3,如何确保模块被导入?

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,就炸掉它 如果

我有一个模块,特别是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,就炸掉它
如果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,因此这一点都不是很好;-)