Допустим, у меня есть словарь, и я хочу проверить, сопоставлен ли ключ с непустым значением. Одним из способов сделать это будет функция len:
mydict = {"key" : "value", "emptykey" : ""}
print "True" if len(mydict["key"]) > 0 else "False" # prints true
print "True" if len(mydict["emptykey"]) > 0 else "False" # prints false
Однако, можно полагаться на семантику Python и на то, как, если объект определен, он оценивается как истина и не учитывает вызов len:
mydict = {"key" : "value", "emptykey" : ""}
print "True" if mydict["key"] else "False" # prints true
print "True" if mydict["emptykey"] else "False" # prints false
Однако я не уверен, что больше Pythonic. Первое ощущение «явное лучше, чем неявное» ", однако второе кажется, что" простой лучше, чем сложный ".
Я также задаюсь вопросом, может ли игнорирование вызова len укусить меня, поскольку dict, с которым я работаю, не обязательно содержит строки, но может содержать другие len -able типы (списки, наборы и т. д.). OTOH, в первом случае (с вызовом len), если None сохраняется как значение, код взорвется, тогда как версия без len будет работать, как ожидалось (будет eval в false ).
Какая версия безопаснее и более Pythonic?
Правка: уточняющие предположения: Я знаю , что ключ находится в словаре, и я знаю, что значения будут увеличиваться. Я также не могу void, имеющий значения нулевой длины, входит в словарь.
Редактировать №2: Похоже, люди упускают суть моего вопроса.Я не пытаюсь определить самый Pythonic / самый безопасный способ проверки наличия ключа в словаре, я пытаюсь проверить, имеет ли значение нулевую длину или нет
При парсинге функции kwargs
, это действительно имеет смысл, почему словарь мог бы содержать ключ, значение которого не Ни один, и что необходимо было бы знать, был ли аргумент той функции передан в равном Ни одному, или просто не определенный. Вот самый простой путь к disabiguate:
def myfunct(**kwargs):
if 'thiskey' not in kwargs:
# this means that 'thiskey' was never passed into myfunct().
kwargs['thiskey'] = <default value>
else:
# you can define the defaults differently;
# if was defined as None, keep it set to None this way.
kwargs['thiskey'] = kwargs.get('thiskey', None)
# otherwise, any defined value passes through.
# do stuff...