Самый питонический способ проверки того, определено ли значение в словаре / имеет ли он нулевую длину

Допустим, у меня есть словарь, и я хочу проверить, сопоставлен ли ключ с непустым значением. Одним из способов сделать это будет функция 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 / самый безопасный способ проверки наличия ключа в словаре, я пытаюсь проверить, имеет ли значение нулевую длину или нет

25
задан Ethan Furman 17 October 2011 в 22:21
поделиться

1 ответ

При парсинге функции 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...
0
ответ дан 28 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: