7

使用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-annotations 将类型与属性相关联” . 然后它演示了这两种方法:

@attr.s
class C:
    x = attr.ib(type=int)
    y: int = attr.ib()

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

4

1 回答 1

7

语法确实有效。但是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(参考标准静态类型检查器)、一些 linter 和一些 IDE 应该将此标记为错误。如果他们还不支持attrib注解,他们几乎肯定会在处理它(因为它们大致相当于3.7/PEP 557dataclass中的注解属性)。

于 2018-03-25T04:50:38.657 回答