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?
Wie am schönsten pathlib.Path erweitern?!?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Hab den Vorschlag:
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...
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("~"))
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...
@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.
- 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?
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?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Du bist albern
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...
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...
- 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
Deswegen mache ich es lieber so, das man es explizit abruft: https://github.com/jedie/PyHardLinkBack ... py#L28-L39
- 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
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