Я хочу расширить тип int
таким образом, чтобы mypy
по-прежнему распознавал его как int. Например:
class u8(int):
_size_bits = 8
_struct_format: str = 'B'
def validate(self):
"Internal function. Mypy shouldn't care about it"
return 0 <= int(self) <= 255
так что я могу использовать
i: u8 = 10
но mypy
выдает ошибку
Incompatible types in assignment (expression has type "int", variable has type "u8")
Предположим, он использует PEP 563, т.е. from __future__ import annotations
.
Приведение его в таком виде сработает, но это приведет к загрязнению, созданию ненужных накладных расходов, и необходимо будет работать в существующем коде, изменяя только подсказку типа, а не код:
i: u8 = u8(10)
Таким образом, единственное необходимое изменение - это добавление подсказки типа, а не изменение остальной части кода. И он должен нормально работать и без набора текста. если я удалю библиотеку (при условии PEP 563), код должен работать нормально, даже если в этом случае он выдаст ошибку на Mypy:
from __future__ import annotations
i: u8 = 10 # Works OK without the u8 definition
i: u8 = u8(10) # ERROR: u8 is not defined here.
Я также пробовал использовать abc.ABC
с регистром, но он не работает:
class u8(int, ABC):
...
u8.register(int)
Это кажется простой задачей, и мне, должно быть, здесь не хватает чего-то довольно очевидного, но все поиски в Google до сих пор не помогли.
10
не является объектом типаu8
. У него не будет этогоvalidate
метода и он не будет вести себя как объектu8
каким-либо значимым образом. - person user2357112 supports Monica   schedule 12.07.2020myvar = u8(10)
- person Jan   schedule 12.07.2020u8(10)
. Кроме того, подсказка типа должна использоваться созданным мной инструментом, поэтому мне нужно явно ввести подсказку. - person Allan Deamon   schedule 12.07.2020