如何指定属性必须是(比方说)整数列表,而不仅仅是列表?

Jef*_*own 7 python types python-3.x python-attrs

使用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
Run Code Online (Sandbox Code Playgroud)

两个评论的行都抛出了NameError: name 'List' is not defined.

我期望这样做的原因是:

(1)attr文档类型部分包括以下段落:" attrs还允许您使用类型参数与attr.ib()或 - 从Python 3.6开始 - 使用PEP 526-annotations将类型与属性相关联" .然后它演示了两种方法:

@attr.s
class C:
    x = attr.ib(type=int)
    y: int = attr.ib()
Run Code Online (Sandbox Code Playgroud)

(2)PEP 526声明类型注释的以下语法有效:primes: List[int] = [].

aba*_*ert 7

语法的确是有效的.但是PEP 484添加的泛型类型注释对象不在内置命名空间中,而是在typing模块中.

因此,您需要执行attrs您链接的文档中的所有示例,以及PEP 484,PEP 483,PEP 526和typing文档:

from typing import List
Run Code Online (Sandbox Code Playgroud)

另请注意,这只是一个注释.你仍然可以写c = C(x=[], y=[1.0]),你不会得到TypeError.正如您链接的文档所说:

attrs它本身没有任何在类型元数据之上工作的功能.但是,它对编写自己的验证器或序列化框架很有用.

它根本不清楚attrs 应该如何处理这个元数据.它是PEP 483/PEP 484设计的核心部分,类型注释只不过是注释是运行时,并不影响值的类型或存储在哪里合法; 它们仅供静态类型检查器和与Python分开运行的其他工具使用.

特别是,Mypy(参考标准静态类型检查器),一些linters和一些IDE应该将此标记为错误.如果他们还不支持attrib注释,他们几乎肯定会在它上面工作(因为它们大致相当于3.7/PEP 557中的dataclass注释属性).