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

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Das `os`-Modul. Oder Java verwenden und da dann `nio.file.Path`. ;-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten