Как написать длинную цепочку os.path.join при соблюдении PEP8 - PullRequest
1 голос
/ 31 мая 2019

Я использую длинную цепочку os.path.join () для создания пути (это гарантирует, что путь будет работать в любой ОС).

"metadata": os.path.join(BASE_DIR, os.path.join('ServiceProvider',os.path.join('config', os.path.join('metadata',os.path.join('gmail_metadata.xml'))))),

Я хотел бы разбить его на несколько строк по PEP8, но я не могу этого добиться.

Я пробовал несколько вещей:

"metadata": os.path.join(BASE_DIR, 
            os.path.join('ServiceProvider',
            os.path.join('config', 
            os.path.join('metadata',
            os.path.join('gmail_metadata.xml'))))),

получитмне ошибка PEP8 continuation line under-indented for visual indentpep8(E128)

и

"metadata": os.path.join(BASE_DIR, os.path.join('ServiceProvider',
                                                    os.path.join('config', os.path.join('metadata',
                                                                                        os.path.join('gmail_metadata.xml'))))),

, что на самом деле то, что сделал автофикс PEP8, я получаю ошибку line too long.

Если этоневозможно исправить ошибки PEP8 в этом случае, я все еще хотел бы знать, как бы вы это сделали!

Ответы [ 2 ]

5 голосов
/ 31 мая 2019

Вы можете составить список всех путей, к которым вы хотите присоединиться, и использовать распаковку списка (подробности в PEP-3132 , чтобы распаковать все ваши аргументы и передать его в os.path.join

import os

#List of paths
li = [BASE_PATH,'ServiceProvider', 'config', 'metadata','gmail_metadata.xml']

#Join all paths by unpacking the list
path = os.path.join(*li)
print(path)
1 голос
/ 31 мая 2019

Модуль pathlib позволит вам цеплять вещи интересным и гибким способом. Прекрасный учебник здесь

import pathlib

# use / operator
path = pathlib.Path("BASE_DIR")
path /= "ServiceProvider" / "config" / "metadata" / "gmail_metadata.xml"
# or
path = pathlib.Path("BASE_DIR") / "ServiceProvider" / "config" / "metadata" / "gmail_metadata.xml"
# or
path = pathlib.Path("BASE_DIR") / 
       "ServiceProvider" / 
       "config" / 
       "metadata" / 
       "gmail_metadata.xml"

Если вы хотите использовать joinpath из os.path модуля или pathlib, тогда вам не нужно вкладывать объединения, достаточно одного.

path = os.path.join(*[BASE_DIR, "ServiceProvider", "config", "metadata", "gmail_metadata.xml"])
# or
path = pathlib.Path("BASE_DIR").join(*["ServiceProvider", "config", "metadata", "gmail_metadata.xml"])
...