如何从 Python ConfigParser .items() 中排除默认值?

2024-03-01

我使用 ConfigParser 从配置文件加载数据,如下所示:

测试.conf:

[myfiles]
fileone: %(datadir)s/somefile.foo
filetwo: %(datadir)s/nudderfile.foo

load.py:

import ConfigParser

config = ConfigParser.ConfigParser({'datadir': '/tmp'})
config.read('test.conf')

print config.items('myfiles')
print config.get('myfiles', 'datadir')

Output:

$ python load.py 
[('datadir', '/tmp'), ('filetwo', '/tmp/nudderfile.foo'), ('fileone', '/tmp/somefile.foo')]
/tmp

我很惊讶变量替换的默认值('datadir', '/tmp')正在作为 的一部分出现。items() and .get()返回,就像它们是配置文件中的值一样。这种行为是预期的吗?任何解决方法,以便我可以简单地迭代.items()没有获取默认字典值,但仍然使用魔术插值?

参考:http://docs.python.org/library/configparser.html http://docs.python.org/library/configparser.html

Thanks!

Update:有人指出,这是预期的行为:默认值就像配置文件中的任何其他名称/值对一样。同样,配置文件中的名称/值对也可用于“神奇插值”,因此如果我定义:

foo: bar
zap: %(foo)snowl

我去拿[... ('zap': 'barnowl')]

这非常简洁,但我仍然想知道是否可以完成我想要完成的任务:迭代配置文件中的名称/值对,使用变量插值,而不使用默认值。

我的具体场景是这样的:我想用类似的东西初始化配置对象{basedir: '/foo/bar'},因为某些文件的绝对路径因安装而异。然后我需要将该配置对象传递给并让各种其他类迭代这些文件。我不希望每个读取配置的类都必须知道它是使用某些默认值初始化的,并且应该忽略它们,因为它们不是实际的文件。这可能吗?有什么办法可以隐藏 .item() 和 .get() 的默认值但仍然有插值?谢谢!


一般来说,我已经找到了configparser.Configparser http://docs.python.org/py3k/library/configparser.html#configparser.ConfigParser课程非常有帮助,但也有所欠缺。其他人也有 http://wiki.python.org/moin/ConfigParserShootout.

然而,它can被子类化和扩展,有时很好,有时不太好(=非常依赖于实现)

这是您的问题的解决方案,已在 Python3 中测试:

class ConfigParser(configparser.ConfigParser):
    """Can get options() without defaults
    """
    def options(self, section, no_defaults=False, **kwargs):
        if no_defaults:
            try:
                return list(self._sections[section].keys())
            except KeyError:
                raise NoSectionError(section)
        else:
            return super().options(section, **kwargs)

这是不好的例子之一,因为它是部分复制的源代码 http://svn.python.org/projects/python/branches/release32-maint/Lib/configparser.py of options()。如果 configparser 基类更好RawConfigParser将提供选项的内部吸气剂_options(self, section)这将包含异常转换,以及options()这会利用它。然后,在子类化中我们可以重用_options().

对于 Python 2,我相信唯一的变化是super()拨电至super(ConfigParser,self).

然后您可以使用:

print config.options('myfiles', no_defaults=True)

并且还使用该列表进行迭代。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Python ConfigParser .items() 中排除默认值? 的相关文章

随机推荐

  • JDBC & 死锁避免问题(基础)

    我正在使用 JDBC 通过 Spring 的 JDBCTemplate 访问数据库中的少量表 虽然我还没有发生任何事情 但我担心可能会出现僵局 我的印象是有一种方法可以为访问多个表的查询指定锁定顺序以避免死锁 但我不知道这是否是创建表时在数
  • 我是否必须在清单文件中声明每项活动?

    我想创建一个 Activity 但不必在清单文件中声明它 这可能吗 在我见过的所有地方 似乎每个活动都必须在清单中声明 但我注意到某些活动 例如内置的 ChooserActivity 并未在我的清单文件中声明 简短的回答 是的 应用程序中的
  • 将 Symfony2 资产转储到 Amazon S3

    在 Symfony 2 中使用 capifony 进行部署后 我想将我的资产转储到生产中的 s3 存储桶中 我找到了一些解决方案 但并没有真正找到最好使用的解决方案 可以使用 Zend Service Amazon S3 转储资产 但我认为
  • Visual Studio 2015 更新 2 - “Scc 显示信息包未正确加载”

    在带有 Update 2 的 Visual Studio 2015 中加载项目 VS 启动时自动加载或手动加载 时 我收到一条错误消息 Scc 显示信息包未正确加载 活动日志有
  • 如何获取 .nupkg 文件的 url?

    我想使用浏览器下载一些 nupkg 文件 在 nuget org 中 没有指向 nupkg 文件的链接 URL 通常采用以下格式 http nuget org api v2 package PACKAGE ID VERSION 例如 对于
  • 如何将日期时间从一个时区转换为另一时区

    记录是根据美国时区保存的 但如果我想向用户显示相同的记录 则应该将服务器日期时间 美国时区 转换为用户的日期时间和用户时区 如果您在 google 中输入 Java 日期更改时区 或 Javascript 日期更改时区 您将得到以下结果之一
  • 设置图表的线条粗细 - Achart 引擎

    我正在为我的 Android 手机应用程序使用 AchartEngine 一切看起来都很好 但渲染图形的线条粗细似乎不太好 我想增加这些图表的厚度 好的 我得到答案了 它应该类似于下面的内容 int length renderer getS
  • 如何部署多个版本的CodePush捆绑包?

    我读过有关targetBinary旗帜和我也读过this https stackoverflow com questions 34869548 codepush how to deploy to multiple build version
  • 无法运行 Rails 服务器:`require':无法加载此类文件 -- net/ssh (LoadError)

    我正在尝试使用 michael hartl 指南来学习 ruby on Rails 过去 我能够完成新的 Rails Web 应用程序的设置 现在 当我尝试运行服务器时 出现以下错误 home ss rvm gems ruby 2 2 2
  • java.sql.SQLException:客户端尝试签出连接已超时

    我有一个java客户端服务器 它应该在启动时建立连接池 但它因超时错误而失败 关于同一问题有很多线程 但没有一个解决方案对我有用 AM使用jdk 7及以下是mchange maven依赖
  • 导入 pandas.DataFrame 时出现“IOError:[Errno 13]权限被拒绝:..”

    我正进入 状态 IOError Errno 13 Permission denied usr local lib python2 7 dist packages python dateutil 2 2 py2 7 egg EGG INFO
  • Haskell 中的电影数据库

    目前正在尝试解决我的 haskell 程序中的两个主要问题 显示给定用户喜欢的所有电影 显示指定演员在某个时间段内发行的所有电影 特定时期 即给定的开始年和结束年之间 这是我当前正在使用的示例数据库 type Title String ty
  • 有没有办法让 MySQL 服务器将数据库更新“推送”到客户端程序?

    一个典型的场景 假设用户正在向 MySQL 提供数据 而客户端远程连接到 MySQL 每当用户更新数据库中的字段时 我希望立即通知客户端 将此视为黑莓的 推送邮件 功能 我不想要的是客户端必须偶尔 ping MySQL 服务器以查看是否有任
  • 在 Spark DataFrame-Scala 中格式化 TimestampType

    当我尝试将字符串字段转换为 Spark DataFrame 中的 TimestampType 时 输出值具有微秒精度 yyyy MM dd HH mm ss S 但我需要的格式是yyyy MM dd HH mm ss即 不包括微秒精度 另外
  • CGAL:线段和多边形之间的交点?

    我有一组多边形 我想测试它和线段之间的交集 我检查了手册 但找不到匹配的功能 点 线 线段 三角形 平面之间确实存在交点 并且多边形之间的交点也在那里 我的问题是 有这样的功能吗 如果不是 是否意味着我需要将多边形分解成段并在这些段之间进行
  • 是否可以在 Perl foreach 循环中分配两个变量?

    是否可以在 Perl foreach 循环中将数组中的相同数据分配给两个变量 我正在使用 Perl 5 我想我在 Perl 6 中遇到了一些东西 像这样的东西 my var1 my var2 foreach var1 var2 array
  • postgresql 中的临时表在所有客户端会话中都可见吗?

    我想创建一个临时表 以便能够将其连接到几个表 因为将这些表与建议的临时表的内容连接起来需要花费大量时间 获取临时表的内容非常耗时 重复它一遍又一遍地花费越来越多的时间 当我的需求完成时 我将删除临时表 我想知道这些临时表是否在其他客户端会话
  • 如何让 fontawesome 在 Azure 网页部署上工作?

    我们正在使用 Twitter Bootstrap 和字体真棒 http fortawesome github com Font Awesome用于图标支持 当部署到我们的一台 IIS 服务器时 我需要添加 MIME 支持 当部署到Azure
  • 调整图像大小而不丢失 EXIF 数据?

    我编写了一个小脚本 可以从 FTP 服务器下载 TIFF 图像 然后调整它们的大小并将它们保存为 JPG 到目前为止 一切顺利 但在压缩步骤 如下所列 中 我丢失了文件中的 EXIF 数据 有没有一种优雅的方法可以在不丢失 EXIF 数据的
  • 如何从 Python ConfigParser .items() 中排除默认值?

    我使用 ConfigParser 从配置文件加载数据 如下所示 测试 conf myfiles fileone datadir s somefile foo filetwo datadir s nudderfile foo load py