使用attrs libary和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)types section of the attr documentation包含以下段落:" attrs
还允许您使用attr.ib()的类型参数或 - 作为属性将类型与属性相关联Python 3.6的使用 - 使用PEP 526-annotations"。然后它演示了两种方法:
@attr.s
class C:
x = attr.ib(type=int)
y: int = attr.ib()
(2)PEP 526声明类型注释的以下语法有效:primes: List[int] = []
。
答案 0 :(得分:6)
语法确实有效。但是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(参考标准静态类型检查器),一些linters和一些IDE应该将此标记为错误。如果他们还不支持attrib
注释,他们几乎肯定会在其上工作(因为它们大致相当于3.7/PEP 557 dataclass
中的注释属性)。