Jaybanuan's Blog

どうせまた調べるハメになることをメモしていくブログ

Pythonでパスを引数に取る場合の型ヒントの書き方

はじめに

ファイルシステムのパスを引数に取る自作の関数で、その型ヒントを毎回以下のように書いていたが、一般的にはどう書くのかが気になって調べた。

import pathlib

def foo(path: str | pathlib.Path):
    ...

環境

$ python3 --version
Python 3.10.12

結論

stackoverflow.com

ここの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.