文字列のdictキーをフォーマットする適切な方法は何ですか?
私がこれをするとき:
>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> "In the middle of a string: {foo.keys()}".format(**locals())
私が期待すること:
"In the middle of a string: ['one key', 'second key']"
私が得るもの:
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
"In the middle of a string: {foo.keys()}".format(**locals())
AttributeError: 'dict' object has no attribute 'keys()'
しかし、ご覧のとおり、私の辞書にはキーがあります。
>>> foo.keys()
['second key', 'one key']
プレースホルダーでメソッドを呼び出すことはできません。プロパティや属性にアクセスしたり、値にインデックスを付けることもできますが、メソッドを呼び出すことはできません。
_class Fun(object):
def __init__(self, vals):
self.vals = vals
@property
def keys_prop(self):
return list(self.vals.keys())
def keys_meth(self):
return list(self.vals.keys())
_
メソッドの例(失敗):
_>>> foo = Fun({'one key': 'one value', 'second key': 'second value'})
>>> "In the middle of a string: {foo.keys_meth()}".format(foo=foo)
AttributeError: 'Fun' object has no attribute 'keys_meth()'
_
プロパティの例(機能):
_>>> foo = Fun({'one key': 'one value', 'second key': 'second value'})
>>> "In the middle of a string: {foo.keys_prop}".format(foo=foo)
"In the middle of a string: ['one key', 'second key']"
_
書式設定構文により、アクセスできるのは属性(la getattr
)またはインデックス(la ___getitem__
_)のプレースホルダーのみ( "Format String Syntax"から取得) であることが明確になります。 ):
Arg_nameの後には、任意の数のインデックスまたは属性式を続けることができます。 _
'.name'
_形式の式はgetattr()
を使用して名前付き属性を選択しますが、_'[index]'
_形式の式は__getitem__()
を使用してインデックス検索を行います。
Python 3.6を使用すると、f文字列でこれを簡単に行うことができます。locals
を渡す必要すらありません。
_>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> f"In the middle of a string: {foo.keys()}"
"In the middle of a string: dict_keys(['one key', 'second key'])"
>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> f"In the middle of a string: {list(foo.keys())}"
"In the middle of a string: ['one key', 'second key']"
_
"In the middle of a string: {}".format([k for k in foo])
上記で他の人が言ったように、好きな方法でそれを行うことはできません。以下に、追加情報を示します Pythonの文字列形式で関数を呼び出す
"In the middle of a string: {}".format(list(foo.keys()))