はじめに
ファイルシステムのパスを引数に取る自作の関数で、その型ヒントを毎回以下のように書いていたが、一般的にはどう書くのかが気になって調べた。
import pathlib def foo(path: str | pathlib.Path): ...
環境
$ python3 --version Python 3.10.12
結論
ここのStackoverflowにある通り、Python 3.10以降の場合は以下のように、
import os def foo(path: str | os.PathLike): ...
そしてPython 3.5 〜3.9の場合は以下のように書くのが良さそう。
import os import typing def foo(path: typing.Union[str, os.PathLike]): ...
余談
ちなみに標準ライブラリの型定義(typeshed-fallback)があるようで、これを確認するとパスを表す型ヒントは以下のようになっている。
StrPath: TypeAlias = str | PathLike[str] # stable BytesPath: TypeAlias = bytes | PathLike[bytes] # stable GenericPath: TypeAlias = AnyStr | PathLike[AnyStr] StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] # stable
stringとbytesの考慮があるが、これはpath-like objectの定義を確認すると以下のようになっているためと思われる。
An object representing a file system path. A path-like object is either a str or bytes object representing a path, or an object implementing the os.PathLike protocol.