Как я могу проверить, соответствует ли объект Python ограничениям типа? - PullRequest
0 голосов
/ 24 сентября 2019

Допустим, у меня есть это ограничение типа для dataclass:

from dataclasses import dataclass
from typing import Sequence
from numbers import Integral

@dataclass
class Coefficients:
    coefs: Sequence[Integral]

Теперь я хочу знать, будет ли объект [1, 2, 3] удовлетворять этому ограничению типа.Я хочу знать это, так как я пишу код / ​​проектирую, не обязательно во время выполнения, так что как решение статической проверки, так и решение времени выполнения подойдут.

Я пробовал isinstance(), но он не работает с параметризованнымтипы:

$ mypy -c 'from typing import Sequence; from numbers import Integral; isinstance([1, 2, 3], Sequence[Integral])'
<string>:1: error: Parameterized generics cannot be used with class or instance checks
$ python -c 'from typing import Sequence; from numbers import Integral; isinstance([1, 2, 3], Sequence[Integral])'
[...]
TypeError: Subscripted generics cannot be used with class and instance checks

В общем, я хотел бы знать, как проверять объекты по произвольным аннотациям типов;хотя я легко могу узнать, является ли List Sequence, а int - Integral, позже я, возможно, захочу проверить более сложные структуры.Как мне это сделать?

1 Ответ

1 голос
/ 24 сентября 2019

Вы можете аннотировать требуемый тип и напрямую запускать mypy.Mypy имеет открытый выпуск о поддержке числовой башни модуля numbers.

mypy -c 'from typing import Sequence
from numbers import Integral
x: Sequence[Integral]
x = [1, 2, 3]'

<string>:4: error: List item 0 has incompatible type "int"; expected "Integral"
<string>:4: error: List item 1 has incompatible type "int"; expected "Integral"
<string>:4: error: List item 2 has incompatible type "int"; expected "Integral"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...