繁体   English   中英

Python 3.4+:扩展pathlib.Path

[英]Python 3.4+: Extending pathlib.Path

下面的代码是我首先尝试的,但是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__ = ()

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'>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM