关于ZAKER 融媒体解决方案 合作 加入

python – sys.setdefaultencoding ( ‘ utf-8 ’ ) 的危险

CocoaChina 09-19

原始海报要求提供代码 , 证明交换机是有害的 – 除了它 " 隐藏 " 与交换机无关的错误 .

结论摘要

根据我收集的经验和证据 , 以下是我得出的结论 .

> 现在将 defaultencoding 设置为 UTF-8 是安全的 , 除了专门的应用程序 , 处理来自非 unicode 就绪系统的文件 .

> 对交换机的 " 官方 " 拒绝是基于与绝大多数最终用户 ( 不是图书馆提供商 ) 不再相关的原因 , 因此我们应该停止阻止用户进行设置 .

> 默认情况下 , 在正确处理 Unicode 的模型中工作比手动使用 unicode API 更适合于系统间通信的应用程序 .

实际上 , 非常频繁地修改默认编码可以避免绝大多数用例中的数量为user headaches. 是的 , 在某些情况下处理多种编码的程序会默默地行为不端 , 但由于这种切换可以零碎地启用 , 因此这不是最终用户代码中的问题 .

更重要的是 , 启用此标志是一个真正的优势是用户的代码 , 既可以减少必须手动处理 Unicode 转换的开销 , 使代码混乱并使其可读性降低 , 又可以避免程序员无法执行此操作时的潜在错误在所有情况下都适当 .

由于这些声明几乎完全与 Python 的官方通信线路相反 , 我认为对这些结论的解释是有道理的 .

在野外成功使用修改后的 defaultencoding 的示例

> Fedora 的 Dave Malcom 认为它是always right.他在调查风险之后提议改变所有 Fedora 用户的分发范围 def.enc.= UTF-8.

尽管 Python 会破坏的原因只是散列行为 I listed, 但核心社区中的任何其他对手都没有将其作为担心甚至same person处理用户票据的理由 .

Resume of Fedora:不可否认 , 变更本身被核心开发人员描述为 " 非常不受欢迎 ", 并被指责与先前版本不一致 .

> 有3000 projects alone at openhub这样做 . 他们有一个慢搜索前端 , 但扫描它 , 我估计 98%使用 UTF-8. 没有发现令人讨厌的惊喜 .

> 有18000 ( ! ) github master branches改变了 .

虽然核心社区的变化是 "unpopular", 但它在用户群中非常受欢迎 . 虽然这可以被忽视 , 但由于已知用户使用 hacky 解决方案 , 我认为这不是一个相关的论点 , 因为我的下一个观点 .

> 由于这个原因 ,GitHub 上只有150 bugreports个 . 以实际 100%的速度 , 变化似乎是积极的 , 而不是消极的 .

为了总结人们遇到的现有问题 , 我已经浏览了所有上述票据 .

> Chaging def.enc. UTF-8 通常是在问题结束过程中引入但未删除的 , 通常作为解决方案 . 考虑到它的 " 坏消息 ", 一些较大的人在temporary fix被删除 , 但更多的错误记者是justgladthe fix.

> 一些 ( 1-5? ) 项目修改了他们的代码手动进行类型转换 , 因此他们不再需要更改默认值 .

> 在两个例子中 , 我看到有人声称使用 def.enc. 设置为 UTF-8 导致完全缺乏of output entirely, 没有解释测试设置 . 我无法验证声明 , 我测试了一个并发现相反的情况属实 .

> 一个claims他的 " 系统 " 可能取决于不改变它 , 但我们不知道为什么 .

> 一个 ( 也是唯一一个 ) 有一个真正的理由要避免它:ipython要么使用第三方模块 , 要么测试运行者以不受控制的方式修改他们的过程 ( 它的支持者提倡 def.enc. 变更从不存在争议仅在翻译设置时 , 即 " 拥有 " 过程时 ) .

> 我发现零指示 " é " 和 "u ’ é " 的不同哈希值会导致现实世界代码出现问题 .

> Python 没有 " 破解 "

将设置更改为 UTF-8 后 , 单元测试所涵盖的 Python 功能与 ?? 没有交换机的情况完全不同 . 但是 , 开关本身根本没有经过测试 .

> 在 bugs.python.org 上建议沮丧的用户

实施例here,herehere

( 经常与官方警告线相关 )

第一个演示了交换机在亚洲的建立程度 ( 与 github 参数相比 ) .

> Ian Bicking published他支持始终启用此行为 .

I can make my systems and communications consistently UTF-8, things will just get better. I really don ’ t see a downside. But why does Python make it SO DAMN HARD [ … ] I feel like someone decided they were smarter than me, but I ’ m not sure I believe them.

> Martijn Fassen, 虽然反驳 Ian,admitted, 但 ASCII 首先可能是错误的 .

I believe if, say, Python 2.5, shipped with a default encoding of UTF-8, it wouldn ’ t actually break anything. But if I did it for my Python, I ’ d have problems soon as I gave my code to someone else.

> 在 Python3 中 , 他们不 " 实践他们所宣扬的 "

反对任何 def.enc. 由于依赖于环境的代码或隐含性而变得如此严厉 , 讨论here围绕‘ unicode sandwich ’的范例以及相应的必要隐含假设进行了讨论 .

此外 , 他们创建了编写有效 Python3 代码的可能性 , 如:

>>> from 褐褑褒褓褔褕褖褗褘 import * >>> def 空手 ( 合氣道 ) : あいき ( ど ( 合氣道 ) ) >>> 空手 ( う?? ( '? ' ) + ? ) ?

> DiveIntoPython recommends it.

> In this thread,Guido 自己advises a professional end user使用特定于进程的环境 , 并将开关设置为 " 为每个项目创建自定义 Python 环境 ".

The fundamental reason the designers of Python ’ s 2.x standard library don ’ t want you to be able to set the default encoding in your app, is that the standard library is written with the assumption that the default encoding is fixed, and no guarantees about the correct workings of the standard library can be made when you change it. There are no tests for this situation. Nobody knows what will fail when. And you ( or worse, your users ) will come back to us with complaints if the standard library suddenly starts doing things you didn ’ t expect.

> Jython 提供即时在模块中即时更改它 .

> PyPy 支持not支持重装 ( 系统 ) – 但user request user request在一天之内没有问题 . 与 CPython 的 "you are doing it wrong" 态度相比 ,claiming没有证明它是 " 邪恶之根 ".

结束此列表我确认可以构造一个因为更改的解释器配置而崩溃的模块 , 执行如下操作:

def is_clean_ascii ( s ) : """ [ Stupid ] type agnostic checker if only ASCII chars are contained in s""" try: unicode ( str ( s ) ) # we end here also for NON ascii if the def.enc. was changed return True except Exception, ex: return False if is_clean_ascii ( mystr ) : <code relying on mystr to be ASCII>

我不认为这是一个有效的论点 , 因为编写这种双类型接受模块的人显然知道 ASCII 与非 ASCII 字符串 , 并且会注意编码和解码 .

我认为这个证据足以表明 , 在绝大多数情况下 , 更改此设置不会导致现实世界代码库中出现任何问题 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 python

觉得文章不错,微信扫描分享好友

扫码分享