データクラスにタイプが何でもよいフィールドがある場合、どのようにしてアノテーションを省略できますか?
@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>
データクラスデコレータは、__annotations__
で名前を探すことにより、クラスを調べてフィールドを見つけます。 フィールドを作成するのは注釈の存在です なので、注釈が必要です。
ただし、一般的なものを使用できます。
@dataclass
class Favs:
fav_number: int = 80085
fav_duck: 'typing.Any' = object()
fav_Word: str = 'potato'
データクラスの意味を定義する PEP 557 によると、
dataclass
デコレータは、クラスを調べてフィールドを見つけます。フィールドは、___annotations__
_で識別される変数として定義されます。つまり、型注釈を持つ変数です。
つまり、この質問の前提(たとえば、「型注釈のないフィールドでdataclass
を使用するにはどうすればよいですか」)を拒否する必要があります。dataclass
のコンテキストでの「field」という用語は、属性に次のような型注釈があることを必要とします。定義。
_typing.Any
_のようなジェネリック型の注釈を使用することは、属性が___annotations__
_に表示されるため、注釈のない属性を持つことと同じではないことに注意してください。
最後に、ヘルパー関数_make_dataclass
_は、属性名のみが指定されている場合、型注釈に_typing.Any
_を自動的に使用します。これは、例とともにPEPにも記載されています。