MyPy не выдает предупреждения об ошибке очистки типа, я ошибаюсь?

Я учусь использовать MyPy. Я думал, что следующий код должен вызывать предупреждения, потому что он может возвращать True, который не является int, как указано в аннотации. Но MyPy умалчивает об этом, когда запускал с mypy program.py.

import typing

def is_prime(n: int) -> int:

    for i in range(2, n):
        if n % i == 0:
            return n

    return True

Я делаю что-то не так здесь?


person blue-dino    schedule 23.04.2019    source источник


Ответы (1)


Булев тип был добавлен в Python 2.3. В модуль встроенный были добавлены две новые константы: True и False. (Константы True и False были добавлены к встроенным модулям в Python 2.2.1, но версии 2.2.1 просто устанавливаются в целочисленные значения 1 и 0 и не являются другим типом.)

bool является подклассом int с двумя одноэлементными значениями, True и False, которые равны 1 и 0 соответственно. Python выполняет это преобразование внутри себя. См. приведенные ниже образцы:

print(True + 1)      # outputs 2
print(True - 1)      # outputs 0
print(True - 2)      # outputs -1
a = True
print(a)             # outputs True because no mathematical calculation
print(True + True + 1) # Outputs 3
print(False + 1)     #  Outputs 3
print(False + True)     #  Outputs 1

Ссылаться:

person Kamal Nayan    schedule 23.04.2019
comment
Это не неявное преобразование, bool просто является подклассом int с двумя одноэлементными значениями, True и False, которые равны 1 и 2. - person juanpa.arrivillaga; 23.04.2019
comment
Да, я имел в виду то же самое. Спасибо за правки. В вашем комментарии есть небольшая опечатка, должно быть 1 и 0. :-) - person Kamal Nayan; 23.04.2019