Jak*_*ger 7 python kwargs configobj
我在python中使用ConfigObj进行模板式插值.通过**展开我的配置字典似乎不进行插值.这是一个功能还是一个bug?有什么好的解决方法吗?
$ 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'
Run Code Online (Sandbox Code Playgroud)
我希望第二行是/test/directory
.为什么插值不能用**kwargs?
解压关键字参数时,会创建一个新对象:类型为dict
。该字典包含配置的原始值(无插值)
示范:
>>> id(config)
31143152
>>> def showKeywordArgs(**kwargs):
... print(kwargs, type(kwargs), id(kwargs))
...
>>> showKeywordArgs(**config)
({'foo': '/test', 'bar': '$foo/directory'}, <type 'dict'>, 35738944)
Run Code Online (Sandbox Code Playgroud)
要解决您的问题,您可以创建配置的扩展版本,如下所示:
>>> expandedConfig = {k: config[k] for k in config}
>>> '{bar}'.format(**expandedConfig)
'/test/directory'
Run Code Online (Sandbox Code Playgroud)
另一种更优雅的方法是简单地避免解包:这可以通过使用函数string.Formatter.vformat来实现:
import string
fmt = string.Formatter()
fmt.vformat("{bar}", None, config)
Run Code Online (Sandbox Code Playgroud)