Как проверить, что два python pathlib.Path имеют одинаковых родителей? - PullRequest
0 голосов
/ 23 января 2019

С двумя Path объектами, которые имеют одинаковые родительские пути, как вы сравниваете их, чтобы утверждать, что они на самом деле имеют одинаковых родителей?

>>> list(Path(input).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> list(Path(output).parents)
[PosixPath('/usr/src/app'), PosixPath('/usr/src'), PosixPath('/usr'), PosixPath('/')]
>>> Path(input).parents == Path(output).parents
False

# huh?

Хотя следующее работает, это кажется неудобнымбросить его на List:

>>> list(Path(input).parents) == list(Path(output).parents)
True

1 Ответ

0 голосов
/ 27 июня 2019

Path.parents фактически возвращает вспомогательный объект, который обеспечивает индексированный доступ и эффективную итерацию по элементам пути (типа pathlib._PathParents).В результате ваше сравнение не выполняется, поскольку он пытается сравнить эти два вспомогательных объекта, а не их содержимое.

Документы несколько вводят в заблуждение в этом смысле:

Path.parents : неизменяемая последовательность, обеспечивающая доступ к логическим предкам пути

... для фактического ответа на вопрос, у вас есть варианты:

Как указано вкомментарии вы можете просто сравнить родителей:

Path(input).parent == Path(output).parent

Это работает во многих случаях, но будет не совпадать, если путь не имеет ту же форму - т.е. когда .. появляется впуть или символические ссылки присутствуют.

Метод Path(...).samefile(...) предоставляет хороший способ избежать этих проблем, но имейте в виду, что использование Path(...).parent.samefile(...) все еще может быть проблемой из-за игнорирования вычисления parent ...

Использование формы Path(...).resolve().parent.samefile(...) - наиболее полный способ избежать всех этих проблем, который я нашел.

Для этого конкретного вопроса это будет выглядеть так:

Path(input).resolve().parent.samefile(Path(output).resolve().parent)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...