• 目标Python2+3


    很多时候你可能希望你开发的程序能够同时兼容Python2+和Python3+。

    试想你有一个非常出名的Python模块被很多开发者使用着,但并不是所有人都只使用Python2或者Python3。这时候你有两个办法。第一个办法是开发两个模块,针对Python2一个,针对Python3一个。还有一个办法就是调整你现在的代码使其同时兼容Python2和Python3。

    我将介绍一些技巧,让你的脚本同时兼容Python2和Python3。

    Future模块导入

    第一种也是最重要的方法,就是导入__future__模块。它可以帮你在Python2中导入Python3的功能。这有一组例子:

    上下文管理器是Python2.6+引入的新特性,如果你想在Python2.5中使用它可以这样做:

    from __future__ import with_statement
    
    

    在Python3中print已经变为一个函数。如果你想在Python2中使用它可以通过__future__导入:

    print
    # Output:
    
    from __future__ import print_function
    print(print)
    # Output: <built-in function print>
    

    模块重命名

    首先,告诉我你是如何在你的脚本中导入模块的。大多时候我们会这样做:

    import foo 
    # or
    from foo import bar
    

    你知道么,其实你也可以这样做:

    import foo as foo
    

    这样做可以起到和上面代码同样的功能,但最重要的是它能让你的脚本同时兼容Python2和Python3。现在我们来看下面的代码:

    try:
        import urllib.request as urllib_request  # for Python 3
    except ImportError:
        import urllib2 as urllib_request  # for Python 2
    
    

    让我来稍微解释一下上面的代码。
    我们将模块导入代码包装在try/except语句中。我们是这样做是因为在Python 2中并没有urllib.request模块。这将引起一个ImportError异常。而在Python2中urllib.request的功能则是由urllib2提供的。所以,当我们试图在Python2中导入urllib.request模块的时候,一旦我们捕获到ImportError我们将通过导入urllib2模块来代替它。

    最后,你要了解as关键字的作用。它将导入的模块映射到urllib.request,所以我们通过urllib_request这个别名就可以使用urllib2中的所有类和方法了。

    过期的Python2内置功能

    另一个需要了解的事情就是Python2中有12个内置功能在Python3中已经被移除了。要确保在Python2代码中不要出现这些功能来保证对Python3的兼容。这有一个强制让你放弃12内置功能的方法:

    from future.builtins.disabled import *
    
    

    现在,只要你尝试在Python3中使用这些被遗弃的模块时,就会抛出一个NameError异常如下:

    from future.builtins.disabled import *
    
    apply()
    # Output: NameError: obsolete Python 2 builtin apply is disabled
    
    

    标准库向下兼容的外部支持

    有一些包在非官方的支持下为Python2提供了Python3的功能。例如,我们有:

    • enum pip install enum34
    • singledispatch pip install singledispatch
    • pathlib pip install pathlib
  • 相关阅读:
    转载 cglib代理和java代理
    解决流不能重复使用
    @RestController的方法中 路径参数带.(点号)配置
    Spring中application*的使用
    转载自用学习 侵权删
    转载学习 多线程中的内存模型和关键字
    转载 幂等的使用
    转载学习 关于线程池
    FastJSON 转换List<T> ,Map<T,T>泛型失败 处理方法
    quartz报错 Couldn't retrieve job because the BLOB couldn't be deserialized: null
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/10116605.html
Copyright © 2020-2023  润新知