7

我在 python 中使用带有模板样式插值的ConfigObj 。通过 ** 展开我的配置字典似乎并没有进行插值。这是功能还是错误?有什么好的解决方法吗?

$ cat my.conf
foo = /test
bar = $foo/directory

>>> import configobj
>>> config = configobj.ConfigObj('my.conf', interpolation='Template')
>>> config['bar']
'/test/directory'
>>> '{bar}'.format(**config)
'$foo/directory'

我希望第二行是/test/directory. 为什么插值不适用于 **kwargs?

4

2 回答 2

2

解包关键字参数时,会创建一个新对象:类型为dict. 该字典包含配置的原始值(无插值)

示范:

>>> id(config)
31143152
>>> def showKeywordArgs(**kwargs):
...     print(kwargs, type(kwargs), id(kwargs))
...
>>> showKeywordArgs(**config)
({'foo': '/test', 'bar': '$foo/directory'}, <type 'dict'>, 35738944)

要解决您的问题,您可以像这样创建配置的扩展版本:

>>> expandedConfig = {k: config[k] for k in config}
>>> '{bar}'.format(**expandedConfig)
'/test/directory'

另一种更优雅的方法是简单地避免拆包:这可以通过使用函数string.Formatter.vformat来实现:

import string
fmt = string.Formatter()
fmt.vformat("{bar}", None, config)
于 2012-07-05T08:33:31.423 回答
2

我有一个类似的问题。

一种解决方法是使用 configobj 的函数“.dict()”。这是因为 configobj 返回一个真实的字典,Python 知道如何解压。

您的示例变为:

>>> import configobj
>>> config = configobj.ConfigObj('my.conf', interpolation='Template')
>>> config['bar']
'/test/directory'
>>> '{bar}'.format(**config.dict())
'/test/directory'
于 2012-09-29T14:03:08.220 回答