2014-11-15 15 views
7

Aşağıdaki kod ilk çalıştığı şey, ama with_suffix yeniden tanımlama yoktu çünkü some_path.with_suffix('.jpg') açıkçası, bir pathlib.PosixPath nesne (Linux çıkıyorum) yerine PosixPath benim sürümünü döndürür. pathlib'dan her şeyi kopyalamak zorunda mıyım yoksa daha iyi bir yolu var mı? some_pathPath sürümü örneğidirPython 3.4+: genişletme pathlib.Path

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__ =() 
+0

Belki dönüştüren bir işlev dekoratör sahip olduğu 'pathlib.Path'' Path' sınıfınıza ulaşır, daha sonra '__metaclass__' veya sınıf dekoratörlerini kullanarak bu dekoratörü tüm sınıf yöntemlerine uygulayabilirsiniz. – kalhartt

+1

Bunu neden yapmak zorunda olduğunuzu anlamıyorum. 'with_suffix()' 'object_ new __ (cls)' olarak adlandırılan '_from_parsed_parts()' işlevlerini çağırır. cls, sizin özel sınıfınızdır, pathlib'den bir şey değil, bu yüzden burada bir 'pathlib' sınıfı ile nasıl sonuçlanabileceğinizi göremiyorum. Herhangi bir fikri olan var mı? Belki de OP'nin farkı görmek için __repr __() 'yi geçersiz kılması gerekiyor? – Kevin

cevap

1

mi?

p = Path('test.foo') 
print(type(p.with_suffix('.bar'))) 

Sonuç doğrudur:

Ben senin kodlarına eklenmiş aşağıdaki 2 hat ile test p = pathlib.Path('test.foo') kullanarak Yalnızca <class '__main__.PosixPath'>

, sonuç <class 'pathlib.PosixPath'>

+0

'Yol'umun bir örneği olmalıydı, ama emin değilim ve sorun artık oluşmuyor (ve kaynak kodunu okuduktan sonra neden gerektiğini anlamıyorum). Böyle durumlar için standart prosedür nedir? Soruyu basitçe silmeli miyim? – Joschua

İlgili konular