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']
__dict__ is A dictionary or other mapping object used to store an object's (writable) attributes. Or speaking in simple words every object in python has an attribute which is denoted by __dict__. And this object contains all attributes defined for the object.
Checking if key exists using the get() method The get() method is a dictionary method that returns the value of the associated key. If the key is not present it returns either a default value (if passed) or it returns None. Using this method we can pass a key and check if a key exists in the python dictionary.
The "AttributeError: 'dict' object has no attribute" means that we are trying to access an attribute or call a method on a dictionary that is not implemented by the dict class. What is this? If you are trying to add key-value pairs to a dictionary, use bracket notation.
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 usinggetattr()
, 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']"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With