如何测试对象是否是 pathlib 路径?

How to test if object is a pathlib path?

我想测试 obj 是否是 pathlib 路径,并意识到条件 type(obj) is pathlib.PosixPath 将是 False 对于 [=22= 上生成的路径]机.

因此问题是,有没有一种方法可以测试对象是否为 pathlib 路径(任何可能的 PathPosixPathWindowsPathPure...-类似物)而不明确检查所有 6 个版本?

是的,使用 isinstance()。一些示例代码:

# Python 3.4+
import pathlib

path = pathlib.Path("foo/test.txt")
# path = pathlib.PureWindowsPath(r'C:\foo\file.txt')

# checks if the variable is any instance of pathlib
if isinstance(path, pathlib.PurePath):
    print("It's pathlib!")

    # No PurePath
    if isinstance(path, pathlib.Path):
        print("No Pure path found here")
        if isinstance(path, pathlib.WindowsPath):
            print("We're on Windows")
        elif isinstance(path, pathlib.PosixPath):
            print("We're on Linux / Mac")
    # PurePath
    else:
        print("We're a Pure path")

为什么 isinstance(path, pathlib.PurePath) 适用于所有类型?看看这张图:

我们看到 PurePath 在顶部,这意味着其他所有东西都是它的子类。因此,我们只需要检查这一项。 Path 检查非纯路径的相同推理。

Bonus:您可以在 isinstance(path, (pathlib.WindowsPath, pathlib.PosixPath)) 中使用元组一次检查 2 种类型。

我喜欢 NumesSanguis 的回答,这就是我使用所学知识的方式:

def check_path_instance(obj: object, name: str) -> pathlib.Path:
    """ Check path instance type then convert and return
    :param obj: object to check and convert
    :param name: name of the object to check (apparently there is no sane way to get the name of the variable)
    :return: pathlib.Path of the object else exit the programe with critical error
    """

    if isinstance(obj, (pathlib.WindowsPath, pathlib.PosixPath)):
        return pathlib.Path(obj)
    else:
        if isinstance(obj, str):
            return pathlib.Path(str(obj)) 
        else:
            logging.critical(
                f'{name} type is: {type(obj)}, not pathlib.WindowsPath or pathlib.PosixPath or str')
            )
            sys.exit(1)