簡體   English   中英

為什么** kwargs不用python ConfigObj進行插值?

[英]Why doesn't **kwargs interpolate with python 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'

我希望第二行是/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)

要解決您的問題,您可以創建配置的擴展版本,如下所示:

>>> 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)

我遇到過類似的問題。

解決方法是使用configobj的函數“.dict()”。 這是有效的,因為configobj返回一個真正的字典,Python知道如何解壓縮。

你的例子變成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM