python 中 __future__ 模块的使用

__future__

或许在看代码时会注意到 __future__ 模块的使用

from __future__ import print_function

那么,__future__ 模块是做什么的?通俗地理解,就是在 python 旧版本中引入新版本的部分语法特征。在导入 __future__ 模块中的某一特征之后,它就可以在后续代码中使用了。

因为 python 是不保证向旧版本兼容的,所以旧版本的代码很可能在新版本会用不了。在准备将旧版本代码移植到新版本时,就可以先在旧版本代码中导入 __future__ 模块进行测试。

__future__ 模块在python 2.1 及其之后的版本中可用,其中,__future__ 模块引入了下面这些特性

特性 强制加入版本 效果
nested_scopes 2.2 PEP 227: Statically Nested Scopes
generators 2.3 PEP 255: Simple Generators
division 3.0 PEP 238: Changing the Division Operator
absolute_import 3.0 PEP 328: Imports: Multi-Line and Absolute/Relative
with_statement 2.6 PEP 343: The “with” Statement
print_function 3.0 PEP 3105: Make print a function
unicode_literals 3.0 PEP 3112: Bytes literals in Python 3000
generator_stop 3.7 PEP 479: StopIteration handling inside generators
annotations 4.0 PEP 563: Postponed evaluation of annotations

下面对其中四个举例说明

  • 精确除法
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1/3
0
>>> 10/3
3
>>> from __future__ import division  # 引入新特征
>>> 1/3
0.3333333333333333
>>> 10/3
3.3333333333333335
  • with 语句
file_handle = open('file_path', 'mode')
file_handle.read()
file_handle.close()

# from __future__ import with_statement # 引入新特征之后
with open('file_path', 'mode') as file_handle:
    file_handle.read()

# 使用 with 语句,一些文件和进程的善后工作就可以不用那么操心,with 的用法也不止这些

  • print 语句
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'hello'  # 打印输出不需要括号
hello
>>> import sys
>>> print >> sys.stderr, 'output to the standard error stream'  # 输出到标准错误流
output to the standard error stream
>>> # 引入新特征之后
>>> from __future__ import print_function
>>> print ('hello')  # 需要括号
hello
>>> print ('output to the standard error stream', file=sys.stderr)  #输出到标准错误流
output to the standard error stream
  • 字符串
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type('hello')  # 字符串为 str 类型
<type 'str'>
>>> type(b'hello')
<type 'str'>
>>> type(u'hello')
<type 'unicode'>
>>> # 引入新特征之后
>>> from __future__ import unicode_literals
>>> type('hello')  # 字符串为 unicode 类型
<type 'unicode'>
>>> type(b'hello')
<type 'str'>
>>> type(u'hello')
<type 'unicode'>

官方文档:https://docs.python.org/zh-cn/3/library/__future__.html