【问题标题】:Is there a recommended format for multi-line imports?是否有推荐的多行导入格式?
【发布时间】:2012-12-31 20:43:18
【问题描述】:

我已经阅读了在 python 中编码多行导入的三种方法

带斜线:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

重复句子:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

带括号:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

此语句是否有推荐的格式或更优雅的方式?

【问题讨论】:

  • 有这么多进口,为什么不只是from Tkinter import *
  • 这是一个例子。真正的声明是from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedField,但不想在 data.forms 中导入所有其余的嵌入字段
  • 很多原因。例如,您可能会覆盖许多您不知道的变量。你知道from Tkinter import *导入的所有名字吗?我不是。并且 IDE 不知道这些名称是否(可能),因此它们无法判断您输入的名称是否无效。
  • @InbarRose 是个坏习惯,看stackoverflow.com/questions/3615125/…

标签: python python-2.7 pep8


【解决方案1】:

通常使用 Tkinter,只使用 from Tkinter import * 是可以的,因为模块只会导出明显是小部件的名称。

PEP 8 没有针对这种情况列出任何约定,所以我想由您决定什么是最佳选择。这一切都与可读性有关,因此请选择任何可以清楚表明您正在从单个模块导入内容的内容。

由于所有这些名称都在您的范围内可用,我个人认为选项 2 是最清晰的,因为您可以最好地看到导入的名称。然后,您甚至可以将其进一步拆分,以将这些彼此所属的名称组合在一起。在您的示例中,我可能会将 TkFrameCanvas 分开放置,因为它们将小部件组合在一起,同时将 ButtonText 分开放置,因为它们是视图中的较小组件。

【讨论】:

  • 从 X 导入 *
  • @ToloPalmer 通常是这样,但是对于 Tkinter 这通常是可以的,因为您只导入小部件;它甚至以in the library reference 的方式列出。如果您将导入列为第一个,那么您应该特别避免任何冲突。
  • 作为参考,即使对于正确使用 __all__ 的软件包,from X import * 的问题是,如果有任何 import *,像 pyflakes 这样的静态代码分析器就无法检测到未定义的名称,因为它必须假设 * 可能导入了任何未定义的名称。
【解决方案2】:

您的示例似乎源于PEP 328。在那里,括号符号是针对这个问题提出的,所以我可能会选择这个。

【讨论】:

    【解决方案3】:

    我个人在导入多个组件时使用括号并按字母顺序对其进行排序。像这样:

    from Tkinter import (
        Button,
        Canvas,
        DISABLED,
        END,
        Entry,
        Frame,
        LEFT,
        NORMAL,
        RIDGE,
        Text,
        Tk,
    )
    

    这有一个额外的好处是可以轻松查看在每次提交或 PR 中添加/删除了哪些组件。

    总的来说,虽然这是个人喜好,但我建议你选择最适合你的东西。

    【讨论】:

    • 我认为重要的是保持一致(至少在给定项目中)。这将使阅读代码的人轻松找到正在导入的内容,而不会有太多困难。
    • isort 可用于自动格式化不同样式的多行导入,见github.com/timothycrosley/isort#multi-line-output-modes
    【解决方案4】:

    我会使用 PEP328 中的括号表示法,并在括号前后添加换行符:

    from Tkinter import (
        Tk, Frame, Button, Entry, Canvas, Text, 
        LEFT, DISABLED, NORMAL, RIDGE, END
    )
    

    这是Django 使用的格式:

    from django.test.client import Client, RequestFactory
    from django.test.testcases import (
        LiveServerTestCase, SimpleTestCase, TestCase, TransactionTestCase,
        skipIfDBFeature, skipUnlessAnyDBFeature, skipUnlessDBFeature,
    )
    from django.test.utils import (
        ignore_warnings, modify_settings, override_settings,
        override_system_checks, tag,
    )
    

    【讨论】:

    • 在 PEP 328 的括号之后/之前没有添加换行符?
    • @GandalfSaxe PEP 328 是关于语义(向语言添加新功能),而不是格式。
    • 那我不太明白。您引用 PEP 328 作为多行导入的括号,但他们没有? “我会使用 PEP328 中的括号符号,在括号前后添加换行符:”
    • PEP 328 为语言添加了括号符号。括号符号是导入多个模块的能力,如下所示:from foo import (bar, baz)。 PEP 328 没有说明格式化。
    • 啊好吧,我明白你的意思了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2019-10-25
    • 2019-10-25
    相关资源
    最近更新 更多