首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候(以及为什么)从‘`ConfigParser`’插值中删除了`__name__`魔术变量?

什么时候(以及为什么)从‘`ConfigParser`’插值中删除了`__name__`魔术变量?
EN

Stack Overflow用户
提问于 2017-11-09 10:59:03
回答 1查看 186关注 0票数 0

在Python2.7中,ConfigParser.ConfigParser插入模式%(__name__)s作为节的名称。

在Python3.6(以及3.3)中,除了configparser.ConfigParser之外,InterpolationMissingOptionError在相同的插值中失败。

插补的行为什么时候改变了?这个决定的理由是什么(因为它损害了向后兼容性)?

如何使用configparser解析器插入节名相反,我是而不是,询问如何在Python3.x中获得这种插值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-11 15:16:43

在python3.2中,旧的ConfigParser类(它实现了__name__插值)被删除,并被以前的SafeConfigParser类所取代。来自什么是新文件

为了提高默认解析器及其支持的INI语法的可用性和可预见性,对syntax解析器模块进行了修改。旧的ConfigParser类被删除,取而代之的是SafeConfigParser,而后者又被重命名为ConfigParser。

详细的动机似乎用这个错误报告来描述

我想总结一下关于__name__行为的所有奇怪的事情,这是解析器实例的每个部分中都存在的一个特殊键。

  1. 每个部分都有一个特殊的__name__密钥。
  2. 除了副总统。
  3. 为从文件中读取的每个部分设置__name__键。
  4. 而不是在add_section()添加时。
  5. 如果__name__确实存在,则在parser.options('section')中不可见
  6. 但在这里可以看到:parser.has_option('section', '__name__') == True
  7. 并且可以通过parser.get('section', '__name__')获得。
  8. 并且可以由parser.set('section', '__name__', 'ANY VALUE')更改。
  9. 并且可以被parser.remove_option('section', '__name__')删除。
  10. 即使parser.set()更改了该值,也不会将其写回带有parser.write()的文件

所有这些看起来都是一个特性,在第一次创建的时候并不是特别完整和定义良好。或者说,随着时间的推移,它已经腐烂了,现在没有人使用它了。这样或那样的话,我无法用当前的实现为__name__提供一个有效的用例。它不具有任何内部用途,您真正能够得到它的唯一方法是返回‘节’的parser.get('section', '__name__')。差不多没什么用了。当然,我们可以使用解析器的内部parser._sections数据结构,但这是有害的。

我只想删除在__name__中提到的一个特殊的configparser.py键。在这里,向后兼容性不是一个问题,因为在本例中,我们有一个概念被打破了,以至于您实际上无法使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47200088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档