Python のタイプヒントとコンテキストマネージャ
質問
コンテキストマネージャはどのようにPythonの型ヒントをアノテーションするべきですか?
import typing
@contextlib.contextmanager
def foo() -> ???:
yield
この のドキュメントは、contextlib の のドキュメントでは、あまり型について触れていません。
は のドキュメントは typing.ContextManager について述べています。 のドキュメントもそれほど役に立つものではありません。
また
typing.Generator
があり、少なくとも例がある。ということは、私は
typing.Generator[None, None, None]
を使うべきで
typing.ContextManager
?
import typing
@contextlib.contextmanager
def foo() -> typing.Generator[None, None, None]:
yield
どのように解決するのですか?
ある関数がどのような型を受け付けるのか100%わからないときは、私はいつも typehed これはPythonのための型ヒントの標準的なリポジトリです。Mypyは型チェックを行うためにtypeshedを直接バンドルし、使用しています。
contextlibのスタブはここで見つけることができます。 https://github.com/python/typeshed/blob/master/stdlib/contextlib.pyi
if sys.version_info >= (3, 2):
class GeneratorContextManager(ContextManager[_T], Generic[_T]):
def __call__(self, func: Callable[..., _T]) -> Callable[..., _T]: ...
def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., GeneratorContextManager[_T]]: ...
else:
def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...
ちょっと無理がありますが、気になるのはこのラインです。
def contextmanager(func: Callable[..., Iterator[_T]]) -> Callable[..., ContextManager[_T]]: ...
デコレータが取り込むのは
Callable[..., Iterator[_T]]
-- 何らかのイテレータを返す、任意の引数を持つ関数です。というわけで、結論から言うと、やっても問題ないでしょう。
@contextlib.contextmanager
def foo() -> Iterator[None]:
yield
では、なぜ
Generator[None, None, None]
を使っても、コメントで提案されているように動作するのはなぜでしょうか?
それは
Generator
のサブタイプだからです。
Iterator
-- のサブタイプです。
は、typeshedを参照することで
. ですから、もしこの関数がジェネレータを返したとしても、それは
contextmanager
が期待するものと互換性があるので、mypy は問題なくそれを受け入れます。
関連
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] バブルソートの宿題
-
[解決済み] Jupyter (IPython)ノートブックのセッションをpickleして保存する方法
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Python 言語を決定するには?
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?
-
[解決済み] 認証プラグイン 'caching_sha2_password' はサポートされていません。