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

 凌彩霞_685 发布于 2023-01-12 18:20

这段代码解决了我遇到的问题.但是,没有重新加载就无法使用"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 个回答
  • 'quirk'是故意删除该功能的site模块 :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()功能的工作方式是它允许您绕过模块缓存; import将只加载一次Python模块; 后续导入为您提供已加载的模块.reload()加载模块a-new就像从未导入过一样,并将新名称合并回现有模块对象(以保留以后添加的额外名称):

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

    何时reload(module)执行:

    重新编译Python模块的代码并重新执行模块级代码,定义一组新的对象,这些对象绑定到模块字典中的名称.init扩展模块的功能不是第二次调用.

    与Python中的所有其他对象一样,只有在引用计数降为零后才会回收旧对象.

    模块名称空间中的名称将更新为指向任何新对象或已更改的对象.

    对旧对象的其他引用(例如模块外部的名称)不会反弹以引用新对象,如果需要,必须在每个命名空间中进行更新.

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

    2023-01-12 18:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有