Formatting dict keys: AttributeError: 'dict' object has no attribute 'keys()'

旧街凉风 提交于 2019-11-29 21:36:06

问题


What is the proper way to format dict keys in string?

When I do this:

>>> foo = {'one key': 'one value', 'second key': 'second value'}
>>> "In the middle of a string: {foo.keys()}".format(**locals())

What I expect:

"In the middle of a string: ['one key', 'second key']"

What I get:

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

But as you can see, my dict has keys:

>>> foo.keys()
['second key', 'one key']

回答1:


You can't call methods in the placeholders. You can access properties and attributes and even index the value - but you can't call methods:

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

Example with method (failing):

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

Example with property (working):

>>> 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']"

The formatting syntax makes it clear that you can only access attributes (a la getattr) or index (a la __getitem__) the placeholders (taken from "Format String Syntax"):

The arg_name can be followed by any number of index or attribute expressions. An expression of the form '.name' selects the named attribute using getattr(), while an expression of the form '[index]' does an index lookup using __getitem__().


With Python 3.6 you can easily do this with f-strings, you don't even have to pass in 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']"



回答2:


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



回答3:


"In the middle of a string: {}".format([k for k in foo])



回答4:


As it was said by others above you cannot do it in the way you would prefer, here are additional information to follow python string format calling a function



来源:https://stackoverflow.com/questions/45736050/formatting-dict-keys-attributeerror-dict-object-has-no-attribute-keys

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!