Python - reload(sys) + sys.setdefaultencoding

看代码时, 发现sys.setdefaultencoding前面有一行reload(sys),不理解是什么作用。研究了一下, 发现下面的内容:

[notfound@core ~]$ python
Python 2.7.9 (default, Dec 11 2014, 04:42:00)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.setdefaultencoding('gb2312')
Traceback (most recent call last):
  File "", line 1, in
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys)

>>> sys.setdefaultencoding('gb2312')
>>

reload(module)

    重新加载已经导入的模块. 参数必须是一个模块对象, 因此模块在之前必须成功导入. 这非常有用,如果你用外部编辑器编辑了模块代码,且希望不离开Python解释器,并使用新版本的模块。

    当重载模块:

        Python模块代码被重新编译,模块级代码被执行,  在模块字典中定义一系列与名称绑定的对象。扩展模块的init函数不会被调用第二次。
        与其它对象一样,Python的旧对象被回收后,计时变为0。
        模块命名空间被更新,并指向新的或已更新的对象。
        旧对象的其他参考(例如: 模块的外部扩展) 未绑定到新对象,如果想要绑定,必须更新命名空间。

    有些注意项:

    如果一个模块在语法上是正确的,但是初始化失败,第一次导入并未绑定其名称,但在sys.modules中会存储一个(部分初始化)的模块对象。调用reload()前,必须确保模块已经被导入。

    当一个模块被重载,它的字典(包含模块的全局变量)被保留。重新定义的名称会覆盖先前定义的名称,这不是什么大问题。如果新模块不包含该名称, 则旧模块中的定义会被保留。如果模块包含一个全局表或缓存对象,那么此特性会有一些高级用法 ---- 使用try声明可以测试表中元素是否存在,并跳过初始化过程:

    try:
        cache
    except NameError:
        cache = {}

    重载内置或动态可加载的模块虽不太常用,但是这么做是合理的,除了sys,__main__,__builtin__。许多时候, 可扩展的模块设计时, 不允许多次初始化。

    若一个模块使用__import__从另一个导入对象,调用reload()不会重新定义从该模块中已导入的对象---- 一种办法就是从声明部分重新执行代码,另一种就是使用import和合格的名称(module.*name*)代替。

    如果模块实例化了一个类,重载该模块,会重新定义该类,但不会影响实例化对象的方法 ---- 它们可以继续使用旧类。这种做法对派生类也有效。

sys.setdefaultencoding(name)

    设置Unicode实现采用的默认编码。如果name无法匹配可用编码, 将会产生LookupError错误。该函数主要是为site 模块实现,需要使用它时, 可指定sitecustomize 。一旦被 site 模块使用, 它会从sys的命名空间中被移出。

/usr/lib/python2.7/site.py

def main():
    global ENABLE_USER_SITE

    abs__file__()
    known_paths = removeduppaths()
    if ENABLE_USER_SITE is None:
        ENABLE_USER_SITE = check_enableusersite()
    known_paths = addusersitepackages(known_paths)
    known_paths = addsitepackages(known_paths)
    if sys.platform == 'os2emx':
        setBEGINLIBPATH()
    setquit()
    setcopyright()
    sethelper()
    aliasmbcs()
    setencoding()
    execsitecustomize()
    if ENABLE_USER_SITE:
        execusercustomize()
    # Remove sys.setdefaultencoding() so that users cannot change the
    # encoding after initialization.  The test for presence is needed when
    # this module is run as a script, because this code is executed twice.

    if hasattr(sys, "setdefaultencoding"):
        del sys.setdefaultencoding




你可能感兴趣的:(python)