Это питон, чтобы использовать бул в качестве интов?



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 или его следует избегать?

460   7  

7 ответов:

Я буду странным голосом (так как все ответы осуждают использование того факта, что False == 0 и True == 1, поскольку язык гарантирует), поскольку я утверждаю, что использование этого факта для упрощения вашего кода совершенно нормально.

исторически логические истинные / ложные операции имели тенденцию просто использовать 0 на ложные и 1 для true; в ходе жизненного цикла Python 2.2 Гвидо заметил, что слишком много модулей начиналось с таких назначений, как false = 0; true = 1 и это произвело boilerplate и бесполезная вариация (последняя, потому что капитализация true и false была повсюду-некоторые использовали все-заглавные буквы, некоторые-строчные, некоторые-начальные) и поэтому ввели bool подкласс int и True и False константы.

был довольно некоторый откат в то время, так как многие из нас боялись, что новый тип и константы будут использоваться новичками Python для ограничения способности языка, но Гвидо был непреклонен, что мы были просто быть пессимистом: никто никогда не поймет Python так плохо, например, чтобы избежать совершенно естественного использования False и True как индексы списка, или в суммировании, или другие такие совершенно ясные и полезные идиомы.

ответы на эту тему доказывают, что мы были правы: как мы и опасались, полное непонимание ролей этого типа и констант и появился, а народ are избегая, и, хуже того!, убеждая других, чтобы избежать, прекрасно естественные конструкции питона в пользу бесполезных вращений.

борясь с волной такого непонимания, я призываю всех использовать Python как Python,не пытается заставить его в форму других языков, функциональность и стиль совершенно разные. В Python, истина и ложь 99,9% как 1 и 0, отличаясь исключительно в своем str(...) (и тем самым repr(...)) -- форма для другие операции, кроме стрингификации, просто не стесняйтесь использовать их без искажений. Это касается индексации, арифметики, битовых операций и т. д.

Я с Алексом. False==0 и True==1 и нет ничего плохого.

тем не менее, в Python 2.5 и позже я бы написал ответ на этот конкретный вопрос, используя условное выражение Python:

def bool_to_str(value):
  return 'Yes' if value else 'No'

таким образом, нет никакого требования, что аргумент на самом деле bool-так же, как if x: ... принимает любой тип для x на bool_to_str() функция должна делать правильные вещи, когда она передается None, строка, список или 3.14.

обязательно:

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

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

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

>>> 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"

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

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

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

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

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

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

print foo, bar, num_things, ("OK", "Too many!)[num_things > max_things]

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

  1. просто использовать логическое значение, условный оператор-это нормально. Люди делают это все время.

    a = 0
    if a:
        do something
    
  2. однако скажите, что вы хотите подсчитать, сколько элементов удалось, код может быть не очень дружелюбным для других людей, чтобы читать.

    def succeed(val):
        if do_something(val):
            return True
        else:
            return False
    
    count = 0
    values = [some values to process]
    for val in values:
        count += succeed(val)
    

но я вижу, что производственный код выглядит так.

all_successful = all([succeed(val) for val in values])
at_least_one_successful = any([succeed(val) for val in values])
total_number_of_successful = sum([succeed(val) for val in values])

Comments

    Ничего не найдено.