web-dev-qa-db-ja.com

辞書キーのフォーマット:AttributeError: 'dict' object has no attribute 'keys()'

文字列の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']
5
Narann

プレースホルダーでメソッドを呼び出すことはできません。プロパティや属性にアクセスしたり、値にインデックスを付けることもできますが、メソッドを呼び出すことはできません。

_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']"
_
7
MSeifert
"In the middle of a string: {}".format([k for k in foo])
0
Ankush Gatfane

上記で他の人が言ったように、好きな方法でそれを行うことはできません。以下に、追加情報を示します Pythonの文字列形式で関数を呼び出す

0
Pablito
"In the middle of a string: {}".format(list(foo.keys()))
0
MetalloyD