ответ
Я не думаю, что у него официальное название, это просто умный/ленивый способ быть кратким. Это примерно эквивалентно:
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 {}
, так давайте дадим ему один :) –
В чем-то вроде var a = b ?? новый b() в C#. –
@Filip: Аналогично, за исключением того, что оператор нулевой коалесценции '??' был специально добавлен к C# для этой цели. Этот трюк в Python работает, потому что None считается ложным в булевом контексте. Но 0, [], {} и т. Д. Также оценивают значение false, поэтому будьте осторожны. Если вы хотите эмулировать '??', лучше написать тест 'is None 'явно, чем полагаться на этот трюк. –
Это не специальная конструкция, по крайней мере, несколько моих усталых глаз. Он говорит, чтобы назначить результат
(b or {})
к.
Итак, если b является значением False, a получает {} (пустой литерал словаря), в противном случае он получает значение b.
точно, но, возможно, есть имя для него. Назначение короткого замыкания - это то, о чем я хотел бы сказать. возможно условное назначение? Но это обычно относится к оператору?:. –
На самом деле, я не полагаюсь на какое-то короткое замыкание, хотя ... Я бы пошел на это, если бы он подавлял некоторый побочный эффект на RHS. Но для этого? –
Это «специальная конструкция», если вы исходите из C++ или Java, где единственные вещи, которые вы можете поместить с обеих сторон «или», являются логическими. Здесь b может быть любым объектом (предположительно, словарем на основе контекста), поэтому (b или {}) является * not * логическим. Совершенно нормально для Pythonista, но не очевидно, если вы изучаете Python в первый раз. – MatrixFrog
По умолчанию Назначение Idiom
официальный или придуманный вами в этот самый момент? –
@ Stefano, я думал, что мы голосуем за то, что, по нашему мнению, должно быть официальное название :) –
Выражение b or {}
это простая boolean OR expression. Особенное это просто, что это выражение не нужно возвращать логическое значение в определение, как и в других языках:
выражения
x or y
первых оценивают х; если x истинно, его значение возвращается; в противном случае вычисляется y и возвращается полученное значение.(Обратите внимание, что ни
and
, ниor
ограничивают значение и типа они возвращаются кFalse
иTrue
, а вернуть последний оцененный аргумент. Это иногда полезно, например, еслиs
является строкой, которая должна быть заменена по умолчанию значение, если оно пустое, выражениеs or 'foo'
дает требуемое значение. Посколькуnot
должно все равно изобретать значение, оно не удостаивает возврата значения того же типа, что и его аргумент, так что, например,not 'foo'
даетFalse
, а не''
.)
- 1. Какое официальное название этой функции синтаксиса?
- 2. Какое официальное название оператора стрелки C++ (->)?
- 3. Какое официальное название Microsoft Metro Design?
- 4. Есть ли название для этой конкретной конструкции?
- 5. Какое официальное название '.' и '->' в C и C++?
- 6. Какое официальное название класса должно быть унаследовано от экземпляра?
- 7. Какое название этой возвышенной темы текста
- 8. Какое традиционное название этой функции Lisp?
- 9. Каково официальное название технологии прокрутки?
- 10. решение этой конструкции?
- 11. Официальное название URL-адреса «схема плюс полномочия»
- 12. Каким будет официальное название C++ 0x?
- 13. Какое формальное название игры для выбора номера?
- 14. Как можно достичь этой конструкции
- 15. Какое название этого типа?
- 16. Каково название этой блок-схемы?
- 17. Есть ли официальное название для комбинированного/многопользовательского блока Java 7?
- 18. Какое решение этой ошибки?
- 19. Каково название этой диаграммы?
- 20. Даунсайд этой макро конструкции и возможные альтернативы
- 21. Как установить AutoLayout Ограничения для этой конструкции
- 22. Какое официальное слово связывается с не-свойствами (например, поля)?
- 23. Какое официальное определение числовых литералов в XPath 1.0?
- 24. Каково официальное название метода аутентификации «domain \ username» для домена?
- 25. Каково официальное название 3-значного кода кредитной карты?
- 26. Какое формальное название для этого?
- 27. Какое название используемого шаблона дизайна
- 28. Какое название локали для корейца?
- 29. Какое имя для этой оптимизации таблицы хэшей?
- 30. Что такое название этой визуализации?
Вы также видите это в Ruby. –
и perl, если я правильно помню –
также в Javascript тоже. – YOU