Я хочу расширить тип 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, ie. 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 до сих пор не помогли.