web-dev-qa-db-ja.com

タイプに注釈を付けずにデータクラスフィールドを追加するにはどうすればよいですか?

データクラスにタイプが何でもよいフィールドがある場合、どのようにしてアノテーションを省略できますか?

@dataclass
class Favs:
    fav_number: int = 80085
    fav_duck = object()
    fav_Word: str = 'potato'

上記のコードは、実際にはfav_duckのフィールドを作成していないようです。それはそれを単純な古いクラス属性にするだけです。

>>> Favs()
Favs(fav_number=80085, fav_Word='potato')
>>> print(*Favs.__dataclass_fields__)
fav_number fav_Word
>>> Favs.fav_duck
<object at 0x7fffea519850>
13
wim

データクラスデコレータは、__annotations__で名前を探すことにより、クラスを調べてフィールドを見つけます。 フィールドを作成するのは注釈の存在です なので、注釈が必要です。

ただし、一般的なものを使用できます。

@dataclass
class Favs:
    fav_number: int = 80085
    fav_duck: 'typing.Any' = object()
    fav_Word: str = 'potato'
6
wim

データクラスの意味を定義する PEP 557 によると、

dataclassデコレータは、クラスを調べてフィールドを見つけます。フィールドは、___annotations___で識別される変数として定義されます。つまり、型注釈を持つ変数です。

つまり、この質問の前提(たとえば、「型注釈のないフィールドでdataclassを使用するにはどうすればよいですか」)を拒否する必要があります。dataclassのコンテキストでの「field」という用語は、属性に次のような型注釈があることを必要とします。定義。

_typing.Any_のようなジェネリック型の注釈を使用することは、属性が___annotations___に表示されるため、注釈のない属性を持つことと同じではないことに注意してください。

最後に、ヘルパー関数_make_dataclass_は、属性名のみが指定されている場合、型注釈に_typing.Any_を自動的に使用します。これは、例とともにPEPにも記載されています。

0
ely