Python 3中TensorFlow代码里的__future__导入语句是否必要?
关于TensorFlow中
__future__导入语句的疑问解答 嘿,我来帮你理清这些__future__导入的疑问,结合你提到的只支持Python3.6+的场景,逐个解答:
1. 仅使用Python 3时,这些语句是否必要?能否安全移除且无不良影响?
完全可以安全移除,而且在Python3.6+环境下这些语句完全没有必要。原因如下:
from __future__ import absolute_import:Python3默认启用了绝对导入,这个语句在Python3中只是冗余的声明,不会改变任何行为。from __future__ import division:Python3中除法运算符/默认就是真除法(比如5/2得到2.5而非2),和这个__future__导入的效果一致。from __future__ import print_function:Python3里print本身就是内置函数,不再是Python2中的语句,所以这个导入也不会产生任何实际作用。
所以在你已经确保运行环境是Python3.6+的前提下,移除这些语句不会有任何不良影响。
2. 这些语句在不同版本Python 3(如3.1 vs 3.6)中是否有差异?
在所有Python3版本中,这三个__future__导入的作用都是冗余的——因为它们对应的特性在Python3发布时就已经成为了默认行为:
- 从Python3.0开始,
absolute_import就是默认规则; - 从Python3.0开始,
/的默认行为就是真除法; - 从Python3.0开始,
print就是函数而非语句。
不管是Python3.1还是3.6,这些语句都不会改变代码的运行逻辑,只是起到了声明作用,对实际执行没有影响。
3. 既然TensorFlow要求Python 3.5+,为何代码库中仍包含这些语句?
这主要是出于兼容性历史遗留和多版本兼容的考虑:
- TensorFlow的代码库最初需要支持Python2.7以及更早的Python3版本(比如3.4),这些
__future__导入可以让代码在Python2环境下启用Python3的特性,保证跨版本的行为一致性(比如让Python2中的/也做真除法,print变成函数)。 - 虽然现在官方要求Python3.5+,但保留这些语句不会对新版本Python产生任何负面影响,同时也能让代码继续兼容那些还在使用旧版本(比如Python2.7或3.4)的用户(比如Ubuntu版本的TensorFlow支持的环境)。
- 对于大型项目来说,保留这些冗余的导入成本极低,却能省去维护多版本代码分支的麻烦。
4. 若移除这些语句,在Python 3.5+环境下是否可能引发问题?请举例说明。
在严格的Python3.5+环境下,移除这些语句不会引发任何问题,因为这些特性已经是默认行为了。举几个例子:
- 除法运算:
5/2在Python3.5+中默认得到2.5,和开启division导入的结果完全一致;如果需要整数除法,你本来就会用//,和是否导入无关。 - print函数:
print("Hello World")在Python3.5+中正常执行,和是否导入print_function无关。 - 绝对导入:假设你有一个自定义模块
math,import math会优先导入标准库的math而非自定义模块,这是Python3的默认行为,和absolute_import导入无关。
唯一可能出问题的场景是,如果你的代码中不小心混入了Python2的语法(比如print "Hello"这种语句式写法),但你已经通过版本检查确保了环境是Python3.6+,这种语法在Python3中本来就会报错,和是否移除__future__导入无关。
内容的提问来源于stack exchange,提问作者cdahms
相关产品推荐
相关产品推荐

