#python #dictionary
#питон #словарь #python
Вопрос:
Следующее работает нормально:
line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % dict (firstname = "Mike", lastname="Kane")
и печатает:
Привет, Майк Кейн, как дела?
Но если у меня нет значения для lastname
, я все равно хочу, чтобы это сработало:
line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % dict (firstname = "Mike")
Я хочу, чтобы он просто игнорировал ключ lastname и печатал:
Привет, Майк , как дела?
Ответ №1:
Вы можете использовать defaultdict
from collections import defaultdict
line = "Hello %(firstname)s %(lastname)s, how are you?"
print line % defaultdict(str, firstname = "Mike")
Объяснение: первый аргумент defaultdict
инициализатора должен быть вызываемым, который возвращает значение по умолчанию. str
вызываемый, который возвращает пустую строку (попробуйте str()
).
Комментарии:
1. Это не гибкий метод, потому что функция factory не принимает аргумент. Если вы используете __missing__ вместо этого, есть много вариантов того, что может быть возвращено.
2. @RaymondHettinger: верно, но этого нет в спецификациях OP.
Ответ №2:
Вы можете использовать make подкласс dictionary, который предоставляет значения по умолчанию для отсутствующих значений:
>>> class Dict(dict):
def __missing__(self, key):
# supply a default value for a given key
return key
>>> d = Dict(firstname = 'Mike')
>>> print "Hello %(firstname)s %(lastname)s, how are you?" % d
Hello Mike lastname, how are you?
Методы дают вам полный контроль над тем, что возвращается. Вот несколько вариантов:
return '--missing--' returns a default string
return key.upper() highlight the missing key
return '' return an empty string
Ответ №3:
class MyDict(dict):
def __missing__(self, key):
return ""
print("Hello %(firstname)s %(lastname)s, how are you?"
% MyDict(firstname = "Mike"))
С принтами
Hello Mike , how are you?