路径库.path允许除字符串和路径之外的其他类型进行连接

2024-10-01 11:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

如何更改pathlib.Path._parse_args,这样我就不能只使用其他类型(如LocalPath)作为Path的参数,还可以使用其他类型作为基于/的连接的参数,等等。。?在

from pathlib import Path
Path(tmplib) / 25 / True

使用tmplibaLocalPath来自py._path.local,其他的自动转换为它们的str()表示?在

我尝试了像这个(pathlib Path and py.test LocalPath)问题所示的子分类和猴子修补,但没有奏效。在

Path看起来很难扩展。在


Tags: pathfrompyimporttrue类型参数parse
2条回答

如果您想保持平台独立的魔力,您可以这样做:

from py._path.local import LocalPath
import os
import pathlib


class Path(pathlib.Path):

    def __new__(cls, *args, **kwargs):
        if cls is Path:
            cls = WindowsPath if os.name == 'nt' else PosixPath
        return cls._from_parts(map(str, args))

    def __truediv__(self, other):
        return super().__truediv__(str(other))

class WindowsPath(Path, pathlib.WindowsPath):
    pass
class PosixPath(Path, pathlib.PosixPath):
    pass

p = Path(LocalPath())
print(p / 25 / True)

或者,如果可以针对特定平台:

^{pr2}$

pathlib(对于Python版本<;3.4,pathlib2)主要由四个与路径PathPosixPathWindowsPath和{}(BasePath中的pathlib2)组成。如果您将其中的每一个子类化,并按照以下方式复制并调整Path.__new__()PurePath._parse_args()的代码:

import os
import sys
if sys.version_info < (3, 4):
    import pathlib2 as pathlib
else:
    import pathlib


class PurePath(pathlib.Path):
    __slots__ = ()
    types_to_stringify = [int]

    @classmethod
    def _parse_args(cls, args):
        # This is useful when you don't want to create an instance, just
        # canonicalize some constructor arguments.
        parts = []
        for a in args:
            if isinstance(a, pathlib.PurePath):
                parts += a._parts
            elif sys.version_info < (3,) and isinstance(a, basestring):
                # Force-cast str subclasses to str (issue #21127)
                parts.append(str(a))
            elif sys.version_info >= (3, 4) and isinstance(a, str):
                # Force-cast str subclasses to str (issue #21127)
                parts.append(str(a))
            elif isinstance(a, tuple(PurePath.types_to_stringify)):
                parts.append(str(a))
            else:
                try:
                    parts.append(a)
                except:
                    raise TypeError(
                        "argument should be a path or str object, not %r"
                        % type(a))
        return cls._flavour.parse_parts(parts)


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


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


class Path(pathlib.Path):
    __slots__ = ()

    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

您将有一个Path,它已经理解了int,可以用来做:

^{pr2}$

获得:

/var/tmp/abc/14/False/testfile.yaml

(您需要为版本<;3.4安装包pathlib2才能在这些版本上工作)。在

上面的Path可以在python3.6中用作open(p)。在

调整_parse_args可以自动支持/__truediv__),以及joinpath()relative_to()等方法

相关问题 更多 >