重新加载模块会提供导入时最初无法使用的功能。我在哪里可以了解更多相关信息?

时间:2014-05-28 17:59:23

标签: python

这段代码解决了我遇到的问题。但是,如果没有重新加载,“setdefaultencoding”就无法使用。

这种语言的怪癖叫什么? 为什么我之前没有告诉过? 我在哪里可以阅读更多相关信息。

import sys;
reload(sys);
sys.setdefaultencoding("utf8")

http://mypy.pythonblogs.com/12_mypy/archive/1253_workaround_for_python_bug_ascii_codec_cant_encode_character_uxa0_in_position_111_ordinal_not_in_range128.html

1 个答案:

答案 0 :(得分:9)

'quirk'是site module 故意删除sys.setdefaultencoding()函数:

# 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

你应该使用它!将默认编码设置为UTF-8就像在你打破并走路后将一根棍子绑在腿上,而不是让医生设置断骨。

真的,让我说清楚:有理由将其删除,原因是你将a)打破任何依赖于正常默认值的模块和b)你正在屏蔽您的实际问题,即通过尽早解码并推迟编码直到您需要再次发送数据来正确处理Unicode。

除此之外,reload() function的工作方式是它允许您绕过模块缓存; import只会加载一次Python模块;后续导入为您提供已加载的模块。 reload()加载模块a-new,好像它从未导入过,并将新名称合并回现有的模块对象(以保留以后添加的额外名称):

  

重新加载以前导入的模块。参数必须是模块对象,因此必须先成功导入。如果您使用外部编辑器编辑了模块源文件并希望在不离开Python解释器的情况下试用新版本,这将非常有用。返回值是模块对象(与模块参数相同)。

     

执行reload(module)时:

     
      
  • 重新编译Python模块的代码并重新执行模块级代码,定义一组新的对象,这些对象绑定到模块字典中的名称。扩展模块的init功能不会再次调用。
  •   
  • 与Python中的所有其他对象一样,只有在引用计数降为零后才会回收旧对象。
  •   
  • 模块名称空间中的名称将更新为指向任何新对象或已更改的对象。
  •   
  • 对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,如果需要,必须在每个命名空间中进行更新。
  •   

因此reload()会将已删除的sys.setdefaultencoding()名称还原到模块中。