Как указать, что атрибут должен быть списком (скажем) целых чисел, а не просто списком?
Используя библиотеки attrs и Python 3.6, я подумал, что следующее позволит мне указать, что x
а также y
может содержать только целые числа:
import attr
@attr.s
class C:
x : List[int] = attr.ib() # not working
y = attr.ib(type=List[int]) # not working either
Обе закомментированные строки бросают NameError: name 'List' is not defined
,
Причины, по которым я ожидал, чтобы это работало, таковы:
(1) Раздел типов документации attr содержит следующий отрывок: "attrs
также позволяет связать тип с атрибутом, используя аргумент типа для attr.ib() или - начиная с Python 3.6 - используя аннотации PEP 526 ". Затем он демонстрирует оба метода:
@attr.s
class C:
x = attr.ib(type=int)
y: int = attr.ib()
(2) PEP 526 утверждает, что следующий синтаксис для аннотации типа действителен: primes: List[int] = []
,
1 ответ
Синтаксис действительно действителен. Но объекты аннотаций универсального типа, добавленные PEP 484, находятся не в пространстве имен встроенных, а в typing
модуль.
Итак, вам нужно сделать то, что все примеры в attrs
документы, которые вы связали, и PEP 484, PEP 483, PEP 526, и typing
документы делают:
from typing import List
Также обратите внимание, что это всего лишь аннотация. Вы все еще можете написать c = C(x=[], y=[1.0])
и вы не получите TypeError
, Как документы, которые вы связали, говорят:
attrs
сам по себе еще не имеет никаких функций, которые работают поверх метаданных типа. Однако это полезно для написания ваших собственных валидаторов или платформ сериализации.
Не совсем понятно что attrs
следует делать с этими метаданными. Центральная часть проекта PEP 483/PEP 484 состоит в том, что аннотации типов являются не более чем аннотациями, выполняемыми во время выполнения, и не влияют на типы значений или то, что разрешено хранить где; они предназначены только для проверки статических типов и других инструментов, запускаемых отдельно от Python.
В частности, Mypy (эталонная стандартная проверка статического типа), некоторые линтеры и некоторые IDE должны отмечать это как ошибку. Если они не поддерживают attrib
аннотации еще, они почти наверняка работают над этим (так как они примерно эквивалентны аннотированным атрибутам в 3.7 / PEP 557 dataclass
).