2010-02-24 9 views

ответ

10

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

a = b if b else {} 

или:

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

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

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

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

a = b if b is not None else {} 
+0

, так давайте дадим ему один :) –

+0

В чем-то вроде var a = b ?? новый b() в C#. –

+1

@Filip: Аналогично, за исключением того, что оператор нулевой коалесценции '??' был специально добавлен к C# для этой цели. Этот трюк в Python работает, потому что None считается ложным в булевом контексте. Но 0, [], {} и т. Д. Также оценивают значение false, поэтому будьте осторожны. Если вы хотите эмулировать '??', лучше написать тест 'is None 'явно, чем полагаться на этот трюк. –

1

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

(b or {}) 

к.

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

+0

точно, но, возможно, есть имя для него. Назначение короткого замыкания - это то, о чем я хотел бы сказать. возможно условное назначение? Но это обычно относится к оператору?:. –

+0

На самом деле, я не полагаюсь на какое-то короткое замыкание, хотя ... Я бы пошел на это, если бы он подавлял некоторый побочный эффект на RHS. Но для этого? –

+0

Это «специальная конструкция», если вы исходите из C++ или Java, где единственные вещи, которые вы можете поместить с обеих сторон «или», являются логическими. Здесь b может быть любым объектом (предположительно, словарем на основе контекста), поэтому (b или {}) является * not * логическим. Совершенно нормально для Pythonista, но не очевидно, если вы изучаете Python в первый раз. – MatrixFrog

1

По умолчанию Назначение Idiom

+1

официальный или придуманный вами в этот самый момент? –

+1

@ Stefano, я думал, что мы голосуем за то, что, по нашему мнению, должно быть официальное название :) –

2

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

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

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

Смежные вопросы