使用属性库和 Python 3.6,我认为以下内容可以让我指定x
and 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) The attr 文档的类型部分包括以下段落:“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] = []
.
The syntax确实有效。但是添加的泛型类型注释对象PEP 484不在内置名称空间中,而是在typing module.
因此,您需要执行以下所有示例的操作attrs
您链接的文档和 PEP 484,PEP 483、PEP 526 和typing
文档做:
from typing import List
另请注意,这只是一个注释。你仍然可以写c = C(x=[], y=[1.0])
你不会得到TypeError
。正如您链接的文档所说:
attrs
本身还没有任何可在类型元数据之上工作的功能。然而,它对于编写您自己的验证器或序列化框架很有用。
完全不清楚是什么attrs
should处理此元数据。 PEP 483/PEP 484 设计的核心部分是类型注释只不过是运行时注释,并且不会影响值的类型或合法存储位置;它们仅供静态类型检查器和其他与 Python 分开运行的工具使用。
特别是,Mypy(参考标准静态类型检查器)、一些 linter 和一些 IDE 应该将此标记为错误。如果他们不支持attrib
注释还没有,他们几乎肯定正在研究它(因为它们大致相当于中的注释属性3.7/PEP 557dataclass).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)