Python 3.4+:扩展 pathlib.Path

Posted

技术标签:

【中文标题】Python 3.4+:扩展 pathlib.Path【英文标题】:Python 3.4+: Extending pathlib.Path 【发布时间】:2015-01-12 23:23:11 【问题描述】:

下面的代码是我首先尝试的,但是some_path.with_suffix('.jpg') 显然返回了一个pathlib.PosixPath 对象(我在Linux 上)而不是我的PosixPath 版本,因为我没有重新定义with_suffix。我必须从pathlib 复制所有内容还是有更好的方法?

import os
import pathlib
from shutil import rmtree


class Path(pathlib.Path):

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        self = cls._from_parts(args, init=False)
        if not self._flavour.is_supported:
            raise NotImplementedError("cannot instantiate %r on your system"
                                      % (cls.__name__,))
        self._init()
        return self

    def with_stem(self, stem):
        """
        Return a new path with the stem changed.

        The stem is the final path component, minus its last suffix.
        """
        if not self.name:
            raise ValueError("%r has an empty name" % (self,))
        return self._from_parsed_parts(self._drv, self._root,
                                       self._parts[:-1] + [stem + self.suffix])

    def rmtree(self, ignore_errors=False, onerror=None):
        """
        Delete the entire directory even if it contains directories / files.
        """
        rmtree(str(self), ignore_errors, onerror)


class PosixPath(Path, pathlib.PurePosixPath):
    __slots__ = ()


class WindowsPath(Path, pathlib.PureWindowsPath):
    __slots__ = ()

【问题讨论】:

也许有一个函数装饰器将pathlib.Path 结果转换为Path 类,然后使用__metaclass__ 或类装饰器将此装饰器应用于所有类方法。 我不明白您为什么需要这样做。 with_suffix() 调用_from_parsed_parts(),后者调用object.__new__(cls)cls 是您的自定义类,而不是 pathlib 中的任何内容,所以我看不出您如何在这里得到 pathlib 类。谁有想法?也许 OP 需要覆盖 __repr__() 才能看到区别? 【参考方案1】:

some_path 是您的Path 版本的实例吗?

我在您的代码中附加了以下 2 行代码:

p = Path('test.foo')
print(type(p.with_suffix('.bar')))

结果正确:<class '__main__.PosixPath'>

仅当使用p = pathlib.Path('test.foo')时,结果为<class 'pathlib.PosixPath'>

【讨论】:

它应该是我的Path 的一个实例,但我不确定并且问题不再发生(阅读源代码后,我不明白为什么这应该)。这种情况的标准程序是什么?我应该直接删除问题吗?

以上是关于Python 3.4+:扩展 pathlib.Path的主要内容,如果未能解决你的问题,请参考以下文章

数据链路层3.4 扩展的以太网

怎么安装python扩展包管理工具pip

3.4 usermod命令 3.5 用户密码管理 3.6 mkpasswd命令

Python 3.4 和 2.7:无法为 python 3.4 安装 numpy 包

在python中 float是啥意思?

强制 Nosetests 使用 Python 2.7 而不是 3.4