「with」ステートメントは型ヒントをサポートしていますか?


16

with構文で定義された変数の型ヒントを定義できますか?

with example() as x:
    print(x)

上記のヒントを入力して、それxstr(例として)であると言います。

私が見つけた唯一の回避策は中間変数を使用することですが、これはハッキーな感じがします。

with example() as x:
    y: str = x
    print(y)

入力ドキュメントに例が見つかりません。


6
型チェッカーはの型をxの戻り型として推測できexample().__enter__()ませんか?
pschill

2
xそれが単に戻り値の型であるときに、なぜ注釈を付けたいのexample.__enter__ですか?理想的には、そのメソッド/関数に注釈を付けます。
a_guest

1
xの戻り値ではありませんexample。の戻り値ですexample().__enter__()
chepner

私が見つけたほとんどのメソッドは、戻り値の型ヒントを定義していません。
Reactgular

1
@Reactgular次に、解決策はその関数のスタブファイルを作成して、型チェッカーが型を推測できるようにすることです。通常は、内部ではなく、API境界で注釈を付けます。この場合、タイプがから来ていることは明らかexampleです。注釈example.__enter__は1つの注釈を意味しますが、あなたのアプローチでは、そのコンテキストマネージャーが使用されるすべての場所で注釈を付ける必要があります。加えて、一般に、APIの戻り値の型が提供されていない場合、ユーザーはどのようにしてAPIの戻り値の型を知るのでしょうか。
a_guest

回答:


11

Python 3.6で実装されたPEP 526では、変数に注釈を付けることができます。たとえば、

x: str
with example() as x:
    [...]

または

with example() as x:
    x: str
    [...]

これは、などの他のコードブロックでも機能しますfor。すばらしい回答、ありがとうございます。
Reactgular

コンテキストマネージャが__enter__メソッドが返すものを示唆していない場合、タイピングxは目的を果たしません。mypy喜んでどんな型の値でもバインドすることができxます。
chepner

@chepnerはい、そうです。PyCharm は両方の場合とx同様strに認識しますが、認識しmypyません。
pschill

14

通常、型注釈はAPI境界に配置されます。この場合、タイプはから推測されexample.__enter__ます。その関数で型が宣言されていない場合の解決策は、型チェッカーがその型を推測できるように、対応するスタブファイルを作成することです。

具体的には.pyi、これExampleはインポート元のモジュールと同じ語幹を持つファイルを作成することを意味します。次に、次のコードを追加できます。

class Example:
    def __enter__(self) -> str: ...
    def __exit__(self, exc_type, exc_value, exc_traceback) -> None: ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.