1. ホーム
  2. python

[解決済み] 現在のクラスを戻り値の型アノテーションとして置く [重複] 。

2022-05-09 23:41:38

質問

<余談
この質問には、すでにここで回答があります :
クローズド 3年前 .

Python 3では、引数と戻り値の型アノテーションを作成することができます。例

class Graph:
    def __init__(self, V: int, E: int, edges: list):
        pass

    @classmethod
    def fromfile(cls, readobj: type(sys.stdin)):
        pass

    def V(self) -> int:
        pass

    def E(self) -> int:
        pass

問題は、まだ定義されていない現在のクラス(Graph)の戻り値の型を持つアノテーションを作ることができないことです。 例

class Graph:
   def reverse(self) -> Graph:
       pass

このコードはエラーになります

def reverse(self) -> Graph:
NameError: name 'Graph' is not defined

これらのアノテーションは、ドキュメントを作成する際にも、IDEが引数や戻り値の型を認識する際にも非常に便利です => オートコンプリートを有効にします。

UPDです。 ということで、これは不可能か、あるいは私が好まないハックが必要だということになり、私は単に def reverse (self) -> 'Graph': これは、ルール違反ではあるが、ドキュメントとしては理解できる。欠点はIDEのオートコンプリートが使えないことです。

解決方法は?

というわけで、しばらくして、私がとった決断は -> 'Graph' の代わりに -> Graph . 私のIDE(PyCharm)ではこの方法では型を認識することができませんが、ドキュメントの作成には十分な働きをします。

もうひとつ考えられるのは、実行時にアノテーションを変更することですが、これではドキュメンテーションの問題が解決されません。

この問題の根源は、クラスが実際に定義される前にクラスオブジェクトを認識することにあります。これはPythonでは単純に不可能なことです。