bool
является подклассом int
, что означает, что они оба натуральные числа . Натуральные числа являются подмножеством действительных чисел, поэтому они приемлемы там, где допустимо число с плавающей запятой.
То, что int
является приемлемым, когда указано float
, явно вызывается в PEP 484 - Типовые подсказки :
Вместо того, чтобы требовать, чтобы пользователи писали import numbers
, а затем использовали numbers.Float
и т. Д., Этот PEP предлагает простой ярлык, который почти столь же эффективен: когда аргумент аннотируется как имеющий тип float
, аргумент типа int
приемлемо [.]
Компонент str
в вашем Union[]
здесь не играет никакой роли; Вы можете удалить его, и все же назначение будет принято. Это просто аннотация типа float
, которая допускает допустимые значения 12
и False
.
Вызов int()
полностью избыточен, буквальный синтаксис 12
уже создает объект int
.