7

attrs ライブラリと Python 3.6を使用して、次のように指定するxy、整数のみを含めることができると考えました。

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.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 (参照標準の静的型チェッカー)、一部のリンター、および一部の IDE では、これをエラーとしてフラグ付けする必要があります。まだアノテーションをサポートしていない場合はattrib、ほぼ確実に取り組んでいます ( 3.7/PEP 557dataclassのアノテーション付き属性とほぼ同等であるため)。

于 2018-03-25T04:50:38.657 に答える