Почему bool и int не считаются ошибкой типа, когда требуются str и float? - PullRequest
0 голосов
/ 12 мая 2019

При использовании mypy и pyre-check для проверки ошибок типа следующего кода ни одна не выдает ошибку:

from typing import List, Union

tlist: List[Union[str, float]] = [False, int(12)]

Просто любопытно, почему это

1 Ответ

2 голосов
/ 12 мая 2019

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

То, что int является приемлемым, когда указано float, явно вызывается в PEP 484 - Типовые подсказки :

Вместо того, чтобы требовать, чтобы пользователи писали import numbers, а затем использовали numbers.Float и т. Д., Этот PEP предлагает простой ярлык, который почти столь же эффективен: когда аргумент аннотируется как имеющий тип float, аргумент типа int приемлемо [.]

  • Компонент str в вашем Union[] здесь не играет никакой роли; Вы можете удалить его, и все же назначение будет принято. Это просто аннотация типа float, которая допускает допустимые значения 12 и False.

  • Вызов int() полностью избыточен, буквальный синтаксис 12 уже создает объект int.

...