相对导入的排序顺序是什么?

3

在Python中,对于相对导入,什么是正确的或PEP方式进行排序?

core/
    __init__.py
    forms.py
    models.py
    tests/
        __init__.py
        form_tests/
             __init__.py
            test_xpto.py
        login.py

如果我正在使用 test_xpto.py 并且想要导入其他文件,正确的方式是什么:
from core.models import Person
from ..login import DefaultLogin
from ...forms import CustomerForm

或者
from ...forms import CustomerForm
from ..login import DefaultLogin
from core.models import Person

或者它不是它们中的任何一种?

1
官方指南在这里:https://www.python.org/dev/peps/pep-0008/#imports。除此之外,其他的决定取决于您和您的团队,您可以自行决定。 - jonrsharpe
请查看相对导入的第十亿次 - martineau
1
根据jonsharpe提供的链接,排序导入后的项目符号指出:“建议使用绝对导入[...]”,因此不要使用相对导入,并遵循前两个项目符号中的指南。然后就没有太多决定了。 - BlackJack
1个回答

2

我得到了一些关于这个问题的答案。根据PEP 328 [1],Guido已经宣布说“相对导入将使用前导点。单个前导点表示相对导入,从当前包开始。两个或更多前导点给出相对导入到当前包的父级,每个点表示一级”[2]。以下是一个示例包布局:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

另一个好的想法是使用isort(一个Python实用程序/库,用于按字母顺序排序导入,并自动分成部分)[3],它遵循了另一种模式来排序导入,这种模式被像Django [4]这样的大型项目所采用:
from __future__ import absolute_import

import os
import sys

from my_lib import Object, Object2, Object3
from third_party import (lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8, lib9,
                         lib10, lib11, lib12, lib13, lib14, lib15)

from . import moduleY
from ...sys import path
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from .moduleY import spam as ham 

[1] https://www.python.org/dev/peps/pep-0328/#guido-s-decision 是一个与Python编程语言相关的网站,其中涉及PEP-0328标准和Guido的决定。
[2] https://mail.python.org/pipermail/python-dev/2004-March/043739.html 是一封与Python开发相关的邮件列表,日期为2004年3月。
[3] https://github.com/timothycrosley/isort 是一个名为isort的Python包,用于自动排序Python导入语句。
[4] https://github.com/timothycrosley/isort/wiki/Projects-Using-isort 是isort包的一个wiki页面,列出了使用isort的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接