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

前端 未结 4 1477
[愿得一人]
[愿得一人] 2021-01-03 01:58

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

When I do this:

>>> foo = {\'one key\': \'one value\', \'second key\': \'second value\         


        
相关标签:
4条回答
  • 2021-01-03 02:16

    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']"
    
    0 讨论(0)
  • 2021-01-03 02:20
    "In the middle of a string: {}".format(list(foo.keys()))
    
    0 讨论(0)
  • 2021-01-03 02:22
    "In the middle of a string: {}".format([k for k in foo])
    
    0 讨论(0)
  • 2021-01-03 02:22

    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

    0 讨论(0)
提交回复
热议问题