Становится домашний каталог с pathlib

просмотр нового pathlib module в Python 3.4 я замечаю, что нет простого способа получить домашний каталог пользователя. Единственный способ, которым я могу придумать для получения домашнего каталога пользователя, - использовать более старый os.path lib вот так:

import pathlib
from os import path
p = pathlib.Path(path.expanduser("~"))

Это кажется неуклюжим. Есть ли лучший способ?

4 ответов


кажется, что этот метод был поднят в отчете об ошибке здесь. Был написан некоторый код (дано здесь) но, к сожалению, не похоже, что он попал в окончательный выпуск Python 3.4.

кстати, предложенный код был очень похож на код, который у вас есть в вашем вопросе:

# As a method of a Path object
def expanduser(self):
    """ Return a new path with expanded ~ and ~user constructs
    (as returned by os.path.expanduser)
    """
    return self.__class__(os.path.expanduser(str(self)))

редактировать

вот простейший подкласс версии PathTest какие подклассы WindowsPath (Я на Windows, но вы можете заменить его на PosixPath). Он добавляет classmethod на основе кода, который был представлен в отчете об ошибках.

from pathlib import WindowsPath
import os.path

class PathTest(WindowsPath):

    def __new__(cls, *args, **kwargs):
        return super(PathTest, cls).__new__(cls, *args, **kwargs)

    @classmethod
    def expanduser(cls):
        """ Return a new path with expanded ~ and ~user constructs
        (as returned by os.path.expanduser)
        """
        return cls(os.path.expanduser('~'))

p = PathTest('C:/')
print(p) # 'C:/'

q = PathTest.expanduser()
print(q) # C:\Users\Username

начиная с python-3.5, есть Path.home(), что несколько улучшает ситуацию.


здесь метод expanduser():

p = PosixPath('~/films/Monty Python')
p.expanduser()
PosixPath('/home/eric/films/Monty Python')

предостережение: этот ответ является 3.4 конкретным. Как указывалось в других ответах, эта функция была добавлена в более поздних версиях.

похоже, что нет лучшего способа сделать это. Я просто искал документация и ничего подходящего для моих условий поиска не появилось.

  • ~ имеет нулевые хиты
  • expand имеет нулевые хиты
  • user имеет 1 хит в качестве возвращаемого значения для Path.owner()
  • relative имеет 8 хитов, в основном, связанные с PurePath.relative_to()