Path.replace эквивалентно os.replace или shutil.move? - PullRequest
1 голос
/ 23 марта 2019

Документация метода pathlib.Path.replace гласит:

Переименуйте этот файл или каталог для указанной цели. Если цель указывает на существующий файл или каталог, он будет безоговорочно заменен.

В этом не хватает деталей. Для сравнения вот документация os.replace:

Переименуйте файл или каталог src в dst. Если dst является каталогом, OSError будет поднят. Если dst существует и является файлом, он будет заменяется молча, если у пользователя есть разрешение. Операция может потерпеть неудачу если src и dst в разных файловых системах. В случае успеха переименование будет атомарной операцией (это требование POSIX).

Важной частью является "Операция может завершиться ошибкой, если src и dst находятся на разных файловых системах" . В отличие от os.replace, shutil.move не имеет этой проблемы:

Если место назначения находится в текущей файловой системе, тогда os.rename() используемый. В противном случае src копируется в dst с использованием copy_function, а затем удален.

Итак, какую из этих функций Path.replace использует? Есть ли риск сбоя Path.replace, поскольку адресат находится в другой файловой системе?

1 Ответ

2 голосов
/ 23 марта 2019

Если вы посмотрите на , исходный код , Path().replace() просто os.replace().

class _NormalAccessor(_Accessor):
    # [...]
    replace = os.replace
# [...]

_normal_accessor = _NormalAccessor()

# [...]

class Path(PurePath):
# [...]
    def _init(self,
              # Private non-constructor arguments
              template=None,
              ):
        self._closed = False
        if template is not None:
            self._accessor = template._accessor
        else:
            self._accessor = _normal_accessor

    # [...]

    def replace(self, target):
        """
        Rename this path to the given path, clobbering the existing
        destination if it exists.
        """
        if self._closed:
            self._raise_closed()
        self._accessor.replace(self, target)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...