zoukankan      html  css  js  c++  java
  • python的__future__模块

    一、概述

    Python的每个新版本都会增加一些新的功能,或者对原来的功能作一些改动。有些改动是不兼容旧版本的,也就是在当前版本运行正常的代码,到下一个版本运行就可能不正常了。
    从Python 2.7到Python 3.x就有不兼容的一些改动,比如2.x里的字符串用'xxx'表示str,Unicode字符串用u'xxx'表示unicode,而在3.x中,所有字符串都被视为unicode。

    因此,写u'xxx'和'xxx'是完全一致的,而在2.x中以'xxx'表示的str就必须写成b'xxx',以此表示“二进制字符串”。

    直接把代码升级到3.x是比较冒进的,因为有大量的改动需要测试。相反,可以在2.7版本中先在一部分代码中测试一些3.x的特性,如果没有问题,再移植到3.x不迟。

    Python提供了__future__模块,把下一个新版本的特性导入到当前版本,于是我们就可以在当前版本中测试一些新版本的特性。

    二、源代码

    个人Python环境,__future__路径:C:ProgramDataAnaconda3Lib\__future__.py

    """Record of phased-in incompatible language changes.
    
    Each line is of the form:
    
        FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease ","
                                  CompilerFlag ")"
    
    where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples
    of the same form as sys.version_info:
    
        (PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
         PY_MINOR_VERSION, # the 1; an int
         PY_MICRO_VERSION, # the 0; an int
         PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
         PY_RELEASE_SERIAL # the 3; an int
        )
    
    OptionalRelease records the first release in which
    
        from __future__ import FeatureName
    
    was accepted.
    
    In the case of MandatoryReleases that have not yet occurred,
    MandatoryRelease predicts the release in which the feature will become part
    of the language.
    
    Else MandatoryRelease records when the feature became part of the language;
    in releases at or after that, modules no longer need
    
        from __future__ import FeatureName
    
    to use the feature in question, but may continue to use such imports.
    
    MandatoryRelease may also be None, meaning that a planned feature got
    dropped.
    
    Instances of class _Feature have two corresponding methods,
    .getOptionalRelease() and .getMandatoryRelease().
    
    CompilerFlag is the (bitfield) flag that should be passed in the fourth
    argument to the builtin function compile() to enable the feature in
    dynamically compiled code.  This flag is stored in the .compiler_flag
    attribute on _Future instances.  These values must match the appropriate
    #defines of CO_xxx flags in Include/compile.h.
    
    No feature line is ever to be deleted from this file.
    """
    
    all_feature_names = [
        "nested_scopes",
        "generators",
        "division",
        "absolute_import",
        "with_statement",
        "print_function",
        "unicode_literals",
        "barry_as_FLUFL",
        "generator_stop",
        "annotations",
    ]
    
    __all__ = ["all_feature_names"] + all_feature_names
    
    # The CO_xxx symbols are defined here under the same names defined in
    # code.h and used by compile.h, so that an editor search will find them here.
    # However, they're not exported in __all__, because they don't really belong to
    # this module.
    CO_NESTED            = 0x0010   # nested_scopes
    CO_GENERATOR_ALLOWED = 0        # generators (obsolete, was 0x1000)
    CO_FUTURE_DIVISION   = 0x2000   # division
    CO_FUTURE_ABSOLUTE_IMPORT = 0x4000 # perform absolute imports by default
    CO_FUTURE_WITH_STATEMENT  = 0x8000   # with statement
    CO_FUTURE_PRINT_FUNCTION  = 0x10000   # print function
    CO_FUTURE_UNICODE_LITERALS = 0x20000 # unicode string literals
    CO_FUTURE_BARRY_AS_BDFL = 0x40000
    CO_FUTURE_GENERATOR_STOP  = 0x80000 # StopIteration becomes RuntimeError in generators
    CO_FUTURE_ANNOTATIONS     = 0x100000  # annotations become strings at runtime
    
    class _Feature:
        def __init__(self, optionalRelease, mandatoryRelease, compiler_flag):
            self.optional = optionalRelease
            self.mandatory = mandatoryRelease
            self.compiler_flag = compiler_flag
    
        def getOptionalRelease(self):
            """Return first release in which this feature was recognized.
    
            This is a 5-tuple, of the same form as sys.version_info.
            """
    
            return self.optional
    
        def getMandatoryRelease(self):
            """Return release in which this feature will become mandatory.
    
            This is a 5-tuple, of the same form as sys.version_info, or, if
            the feature was dropped, is None.
            """
    
            return self.mandatory
    
        def __repr__(self):
            return "_Feature" + repr((self.optional,
                                      self.mandatory,
                                      self.compiler_flag))
    
    nested_scopes = _Feature((2, 1, 0, "beta",  1),
                             (2, 2, 0, "alpha", 0),
                             CO_NESTED)
    
    generators = _Feature((2, 2, 0, "alpha", 1),
                          (2, 3, 0, "final", 0),
                          CO_GENERATOR_ALLOWED)
    
    division = _Feature((2, 2, 0, "alpha", 2),
                        (3, 0, 0, "alpha", 0),
                        CO_FUTURE_DIVISION)
    
    absolute_import = _Feature((2, 5, 0, "alpha", 1),
                               (3, 0, 0, "alpha", 0),
                               CO_FUTURE_ABSOLUTE_IMPORT)
    
    with_statement = _Feature((2, 5, 0, "alpha", 1),
                              (2, 6, 0, "alpha", 0),
                              CO_FUTURE_WITH_STATEMENT)
    
    print_function = _Feature((2, 6, 0, "alpha", 2),
                              (3, 0, 0, "alpha", 0),
                              CO_FUTURE_PRINT_FUNCTION)
    
    unicode_literals = _Feature((2, 6, 0, "alpha", 2),
                                (3, 0, 0, "alpha", 0),
                                CO_FUTURE_UNICODE_LITERALS)
    
    barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2),
                              (3, 9, 0, "alpha", 0),
                              CO_FUTURE_BARRY_AS_BDFL)
    
    generator_stop = _Feature((3, 5, 0, "beta", 1),
                              (3, 7, 0, "alpha", 0),
                              CO_FUTURE_GENERATOR_STOP)
    
    annotations = _Feature((3, 7, 0, "beta", 1),
                           (4, 0, 0, "alpha", 0),
                           CO_FUTURE_ANNOTATIONS)  

     

    三、使用说明

    1.division

    • Python2

      整数相除的结果为取整去余;浮点数相除为精确除法

      

    • Python3

      默认为精确除法;如果需要取整时使用//,也称之为地板除

      

     2.print

    • Python2中print为打印关键字

       

    • Python3中print为打印函数名

       

     3.unicode_literals

    • Python2,字符串默认为str类型;添加前缀u后变为Unicode类型

      

    • Python3,字符串默认为Unicode类型;如果需要str类型,添加前缀b

     4.absolute_import

    首先需要了解相对导入、绝对导入的概念

    相对导入:在不指明 package 名的情况下导入自己这个 package 的模块,比如一个 package 下有 a.py 和 b.py 两个文件,在 a.py 里 from . import b 即是相对导入 b.py

    绝对导入:指明顶层 package 名,比如 import a,Python 会在 sys.path里寻找所有名为 a 的顶层模块

    • Python2,支持绝对导入,
    • Python3,支持相对导入、绝对导入
  • 相关阅读:
    比较两个NSDate
    关于修改UIWebView的UserAgent
    iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单
    iOS系统自带分享功能
    swift中的协议
    iOS性能优化:Instruments使用实战
    iOS利用HealthKit框架从健康app中获取步数信息
    iOS设备型号
    iOS消息推送机制
    Swift进阶
  • 原文地址:https://www.cnblogs.com/hester/p/11870501.html
Copyright © 2011-2022 走看看