Это - Pythonic для использования bools в качестве ints?

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, или этого нужно избежать?

65
задан hwiechers 4 July 2010 в 13:51
поделиться

5 ответов

Я буду странным голосом (так как все ответы осуждают использование того факта, что 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 - для каждой другой операции, кроме стрингификации, просто используйте их без искажений. Это касается индексации, арифметики, битовых операций и т. Д. И т. Д.

162
ответ дан 24 November 2019 в 15:09
поделиться

конечно:

def bool_to_str(value):
    "value should be a bool"
    return 'Yes' if value else 'No'

более читабельно.

37
ответ дан 24 November 2019 в 15:09
поделиться

На самом деле это особенность языка: False == 0 и True == 1 (не зависит от реализации): Is False == 0 и True == 1 в Python - это деталь реализации или гарантируется ли это языком?

Однако я согласен с большинством других ответов: есть более удобочитаемые способы получения того же результата, что и ['Нет', 'Да'] [значение] посредством использования … if value else… или словаря, которые имеют соответствующие преимущества подсказки и утверждения, что значение является логическим.

Кроме того, … if value else… следует обычному соглашению о том, что значение, отличное от 0, является True: оно также работает, даже когда value == -2 (значение True), как намекает георгин. Подходы list и dict в этом случае не так надежны, поэтому я бы не рекомендовал их.

5
ответ дан 24 November 2019 в 15:09
поделиться

Ваш код кажется неточным в некоторых случаях:

>>> 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"
13
ответ дан 24 November 2019 в 15:09
поделиться

Использование bool в качестве int вполне нормально, потому что bool является подклассом int.

>>> isinstance(True, int)
True
>>> isinstance(False, int)
True

О вашем коде: помещать его в однострочную функцию вроде этого - это наверху. Читателям необходимо найти источник вашей функции или документы и прочитать их (название функции мало что вам говорит). Это прерывает поток. Просто поместите его в строку и не используйте список (построенный во время выполнения), используйте кортеж (построенный во время компиляции, если значения являются константами). Пример:

print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]
1
ответ дан 24 November 2019 в 15:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: