Какое официальное название этой конструкции? - PullRequest
5 голосов
/ 24 февраля 2010

В питоне:

>>> a = b or {}

Ответы [ 5 ]

10 голосов
/ 24 февраля 2010

Я не думаю, что у него есть официальное название, это просто умный / ленивый способ быть кратким. Это примерно эквивалентно:

a = b if b else {}

или

if b:
    a = b
else:
    a = {}

Я написал это как комментарий, но думаю, стоит упомянуть здесь:

Вы должны быть очень осторожны при использовании этого трюка. Если вы намерены установить значение по умолчанию, когда что-то равно None, было бы лучше написать этот is None тест явно, чем использовать этот трюк. Причина в том, что None - не единственная вещь, которая оценивает значение false в логическом контексте. 0, [], {}, ... также оценивается как ложное. Так что этот трюк может не дать ожидаемых результатов, если вы не задумывались об этих особых случаях.

Вот один из способов сделать это безопаснее:

a = b if b is not None else {}
2 голосов
/ 24 февраля 2010

Выражение b or {} - это просто логическое выражение ИЛИ .Особенность этого в том, что это выражение не должно возвращать логическое значение для определения, как в других языках:

Выражение x or y сначала оценивает x ;если x равно true, возвращается его значение;в противном случае y оценивается и возвращается полученное значение.

(Обратите внимание, что ни and, ни or не ограничивают значение и тип, который они возвращают, False и True, но лучше вернуть последний оцененный аргумент. Это иногда полезно, например, если s является строкой, которую следует заменить значением по умолчанию, если оно пустое, выражение s or 'foo' возвращает желаемое значение. Поскольку notв любом случае ему нужно придумать значение, он не должен возвращать значение того же типа, что и его аргумент, например, not 'foo' дает False, а не ''.)

1 голос
/ 24 февраля 2010

Идиома назначения по умолчанию

1 голос
/ 24 февраля 2010
1 голос
/ 24 февраля 2010

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

 (b or {}) 

до а.

Таким образом, если b является значением False, a получает {} (литерал пустого словаря), в противном случае он получает значение b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...