这段代码解决了我遇到的问题。但是,如果没有重新加载,“setdefaultencoding”就无法使用。
这种语言的怪癖叫什么? 为什么我之前没有告诉过? 我在哪里可以阅读更多相关信息。
import sys;
reload(sys);
sys.setdefaultencoding("utf8")
这
答案 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()
名称还原到模块中。