Seite 1 von 1

Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Mittwoch 27. Januar 2016, 16:55
von jens
Leider kann man nicht einfach erben und dann eigene Methoden dabei packen.

Siehe u.a.:
https://bugs.python.org/issue24132
https://stackoverflow.com/questions/269 ... thlib-path
https://stackoverflow.com/questions/298 ... path-fails

Welchen Vorschlag hättet ihr dazu?

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Mittwoch 27. Januar 2016, 17:23
von jens
Hab den Vorschlag:

Code: Alles auswählen

import os
import pathlib
import shutil


class SharedPathMethods:
    @property
    def path(self):
        return str(self)

    def makedirs(self, *args, **kwargs):
        os.makedirs(self.path, *args, **kwargs)

    def link(self, other):
        os.link(self.path, other.path)

    def utime(self, *args, **kwargs):
        os.utime(self.path, *args, **kwargs)

    def copyfile(self, *args, **kwargs):
        shutil.copyfile(self.path, *args, **kwargs)


class WindowsPath2(SharedPathMethods, pathlib.WindowsPath):
    pass


class PosixPath2(SharedPathMethods, pathlib.PosixPath):
    pass


class Path2(pathlib.Path):
    def __new__(cls, *args, **kwargs):
        if cls is Path2 or cls is pathlib.Path:
            cls = WindowsPath2 if os.name == 'nt' else PosixPath2
        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

    @classmethod
    def home(cls):
        try:
            return pathlib.Path.home()
        except AttributeError:
            # Exist since in Python 3.5
            return cls(os.path.expanduser("~"))
Man kann unter WindowsPath2 und PosixPath2 spezielle Methoden hinterlegen, die nur für die jeweiligen Plattformen sind.

Dumm: home() und path() gibt es in späteren Versionen. Also schöner wäre es, wenn die eigenen nur dann genutzt werden, wenn die Originalen das nicht haben... Bei home() ist das der Fall, bei path() weiß ich nicht so recht, wie ich das machen sollte...

Außerdem wäre home() besser bei SharedPathMethods anzusiedeln...

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Mittwoch 27. Januar 2016, 17:43
von BlackJack
@jens: Im Bugreport wird eindeutig gesagt die Klasse ist nicht dafür gedacht das man davon erbt. Am schönsten macht man das also *gar nicht*. IMHO integriert sich `pathlib` sowieso nicht wirklich schön mit dem Rest der Standard-API und allen anderen Modulen/Packages.

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Mittwoch 27. Januar 2016, 18:07
von jens
Ja da hast du recht, pathlib ist nicht gut integriert...

Grundsätzlich finde ich das modul aber gut. Von der Benutzerseite her... Allerdings finde ich, sollte wirklich alles rund um Dateien/Verzeichnisse/Links usw. enthalten sein.

Welche Alternativen gibt es?

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Mittwoch 27. Januar 2016, 18:18
von BlackJack
@jens: Das `os`-Modul. Oder Java verwenden und da dann `nio.file.Path`. ;-)

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Donnerstag 4. Februar 2016, 22:22
von jens
Du bist albern :P

Wie ich im Nachbarthread "NTFS: Pfadlänge max. 259 Zeichen..." -> viewtopic.php?f=1&t=37931&p=290999#p290999 schon erwähnt habe, wäre es toll, wenn alle Pfade unter Windows mit dem Prefix \\?\ versehen werden könnten...

Ideen?

Wobei: Der Test bei viewtopic.php?f=1&t=37931&p=290999#p290891 hat ja gezeigt, das \\?\ die Limitierung nur von 259 auf 284 erweitert... :evil:

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Freitag 5. Februar 2016, 00:26
von jens
Ein Hack wie bei https://github.com/jedie/PyHardLinkBack ... py#L28-L39 geht zwar grundsätzlich schon, aber hat ein paar Nebenwirkungen...

Deswegen mache ich es lieber so, das man es explizit abruft: https://github.com/jedie/PyHardLinkBack ... py#L28-L39

Re: Wie am schönsten pathlib.Path erweitern?!?

Verfasst: Freitag 5. Februar 2016, 15:38
von jens
So... Da es sich nun doch bestätigt, das die \\?\ Notation die Lösung ist (s. viewtopic.php?f=1&t=37931&p=291018#p291018 ) habe ich für PyHardLinkBackup nun eine Idee:

Ich werde alle Dateioperationen in meine eigene Path2() Klasse verlagern und dort immer auf extended_path zurück greifen, der unter Windows jeden absoluten Pfad mit "\\?\" versieht, siehe: https://github.com/jedie/PyHardLinkBack ... .py#L6-L45