如何在遵守PEP8的同时编写长os.path.join链

时间:2019-05-31 07:04:59

标签: python pep8

我正在使用一长串的 os.path.join() 来生成路径(它确保该路径可以在任何OS上使用)。

"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 个答案:

答案 0 :(得分:4)

您可以列出要加入的所有路径,并使用列表解压缩(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 :(得分:1)

pathlib模块将使您以有趣且灵活的方式链接事物。 Lovely tutorial here

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"])