в чем смысл этого (избыточного?) выражения python? - PullRequest
2 голосов
/ 31 января 2012
str='test'
example={'test':'value',}
return str in example and example[str] or None

почему избыточный дополнительный тест для ключа str in example?

Ответы [ 6 ]

6 голосов
/ 31 января 2012

В этом конкретном примере проверка состоит в том, чтобы сначала убедиться, что «test» действительно является действительным ключом в примере dict, в противном случае вы получите исключение KeyError. Затем логика переходит к проверке ключа и либо возвращает его, либо None, если значение примера [str] принимает значение False

Было бы намного проще, если бы этот пример просто сделал:

str='test'
example={'test':'value',}
return example.get(str, None) or None

Обновление

Еще проще, так как дополнительный параметр get () не нужен:

return example.get(str) or None

Обновление 2 : отключение тестов на истинность и логических операций из OP (на основе комментариев)

example = {
    'test' : 'value', 
    'test2': 0, 
    'test3': [],
}
test = lambda k: k in example and example[k] or None
print test('test')
# value
print test('test2')
# None
print test('test3')
# None
3 голосов
/ 31 января 2012

Начнем с того, что поведение отличается для случая, когда вы ищете несуществующий ключ (дополнительный тест предотвратит появление исключения KeyError).

Однако, это идет дальше, потому что example[str] может быть ложным в логическом контексте.например, это может быть пустая строка.

>>> str='test'
>>> example={'test':[],}
>>> str in example and example[str] or None
>>> str in example or None
True

Так что это не совсем избыточно.str in example проверяет наличие ключа, тогда как and example[str] также проверяет правильность значения.

2 голосов
/ 31 января 2012

Поскольку Python лениво оценивает логические значения, вы можете безопасно опускать скобки в простых тестах.Это может облегчить чтение:

(str in example and example[str]) or None

На простом английском языке:

"Убедитесь, что в словаре example есть ключ str и что ключ также не имеетЛожное значение. Если это так, вернуть значение ключа example[str]. В противном случае вернуть None "

0 голосов
/ 31 января 2012

Если ключ не существует, он получит KeyError exception

#!/usr/bin/python

str='test'
example={'test':'value',}

if str in example and example[str]:
    print example[str]
else:
    print False
0 голосов
/ 31 января 2012

Изящный провал. Если ключ не существует, поиск 'example [str]' завершится неудачно во время выполнения. Вы получите ошибку, прекратите работу своего приложения и получите обратную трассировку. Проверив сначала ключ, вы получите вместо него значение None, и ваше приложение продолжит свою работу.

Другой, более общий подход - перехватывать исключение и возвращать None в результате этого.

def testfun():
    str='test2'
    example={'test':'value',}
    try:
        return example[str]
    except KeyError:
        return None
0 голосов
/ 31 января 2012

str in example является логическим тестом, чтобы увидеть, является ли str ключом в example, тогда как example[str] возвращает фактическое значение, связанное с этим ключом.

...