False
эквивалентно 0
и True
эквивалентно 1
таким образом, возможно сделать что-то вроде этого:
def bool_to_str(value):
"""value should be a bool"""
return ['No', 'Yes'][value]
bool_to_str(True)
Заметьте, как значение bool
но используется в качестве int
.
Является этим этим видом использования Pythonic, или этого нужно избежать?
Я буду странным голосом (так как все ответы осуждают использование того факта, что False == 0
и True == 1
], как гарантирует язык), поскольку я утверждаю, что использование этого факта для упрощения кода совершенно нормально.
Исторически сложилось так, что логические операции «истина / ложь» имели тенденцию просто использовать 0
для ложного и 1
для истинного; в ходе жизненного цикла Python 2.2 Гвидо заметил, что слишком много модулей запускаются с такими присваиваниями, как false = 0; true = 1
, и это произвело шаблонный и бесполезный вариант (последний, потому что заглавные буквы true и false были повсюду - некоторые использовали все заглавные буквы, некоторые все строчные буквы, некоторые заглавные буквы) и поэтому представили bool
подкласс int
и его константы True
и False
.
В то время был некоторый отпор, поскольку многие из нас опасались, что новый тип и константы будут использоваться новичками в Python для ограничения возможностей языка, но Гвидо был непреклонен в том, что мы просто пессимистичны. : никто бы никогда не понял Python так плохо, например, чтобы избежать совершенно естественного использования False
и True
в качестве индексов списка, или в суммировании, или других подобных совершенно ясных и полезные идиомы.
Ответы в этой беседе доказывают, что мы были правы: как мы и опасались, возникло полное непонимание ролей этого типа и констант , и люди избегают, и, хуже !, призывая других избегать совершенно естественных конструкций Python в пользу бесполезных вращений.
Борясь с волной такого недоразумения, я призываю всех использовать Python как Python , , а не , пытаясь навязать его другим языкам, функциональность и предпочтительный стиль которых вполне достаточны. разные. В Python значения True и False на 99,9% похожи на 1 и 0, отличаясь исключительно их str (...)
(и, следовательно, repr ( ...)
) form - для каждой другой операции, кроме стрингификации, просто используйте их без искажений. Это касается индексации, арифметики, битовых операций и т. Д. И т. Д.
конечно:
def bool_to_str(value):
"value should be a bool"
return 'Yes' if value else 'No'
более читабельно.
На самом деле это особенность языка: False == 0 и True == 1 (не зависит от реализации): Is False == 0 и True == 1 в Python - это деталь реализации или гарантируется ли это языком?
Однако я согласен с большинством других ответов: есть более удобочитаемые способы получения того же результата, что и ['Нет', 'Да'] [значение]
посредством использования … if value else…
или словаря, которые имеют соответствующие преимущества подсказки и утверждения, что значение
является логическим.
Кроме того, … if value else…
следует обычному соглашению о том, что значение, отличное от 0, является True: оно также работает, даже когда value == -2
(значение True), как намекает георгин. Подходы list и dict в этом случае не так надежны, поэтому я бы не рекомендовал их.
Ваш код кажется неточным в некоторых случаях:
>>> def bool_to_str(value):
... """value should be a bool"""
... return ['No', 'Yes'][value]
...
>>> bool_to_str(-2)
'No'
И я рекомендую вам использовать только условный оператор для читабельности:
def bool_to_str(value):
"""value should be a bool"""
return "Yes" if value else "No"
Использование bool в качестве int вполне нормально, потому что bool является подклассом int.
>>> isinstance(True, int)
True
>>> isinstance(False, int)
True
О вашем коде: помещать его в однострочную функцию вроде этого - это наверху. Читателям необходимо найти источник вашей функции или документы и прочитать их (название функции мало что вам говорит). Это прерывает поток. Просто поместите его в строку и не используйте список (построенный во время выполнения), используйте кортеж (построенный во время компиляции, если значения являются константами). Пример:
print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]