有多行导入的推荐格式吗?


113

我已经阅读了在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)

此语句是否有推荐的格式或更简洁的方法?


3
进口这么多,为什么不from Tkinter import *呢?
Inbar Rose 2013年

2
这是一个例子。真正的声明是,from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedField但不想导入data.forms中的所有其他嵌入式字段
Manuel Alvarez

18
很多原因。例如,您可能会覆盖许多您不知道的变量。您知道所有由导入的名称from Tkinter import *吗?我不是。IDE可能不知道这些名称(也许),因此它们无法判断您是否输入了无效的名称。
Thorsten Kranz 2013年

2
@InbarRose这是一个不好的习惯中,看看stackoverflow.com/questions/3615125/...
尤瓦PRUSS

Answers:


161

就个人而言,导入多个组件并按字母顺序对它们进行括号处理。像这样:

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

这具有额外的优势,即可以轻松查看每个提交或PR中已添加/删除了哪些组件。

总的来说,尽管这是个人喜好,但我建议您选择最适合自己的方式。


3
我认为重要的是要保持一致(至少在给定的项目内)。这样一来,阅读代码的人就可以很容易地找到要导入的内容。
Blckknght

1
isort可用于自动格式化不同样式的多行导入,请参阅github.com/timothycrosley/isort#multi-line-output-modes
Motin


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与语义有关(向语言添加了新功能),与格式无关。
Max Malysh '18年

那我不太明白。您将PEP 328引用为带有多行导入的括号,但没有?“我将使用PEP328的括号符号,并在括号之前和之后添加换行符。”
Gandalf Saxe,

PEP 328在该语言中添加了括号符号。括号表示法可以导入多个模块,如下所示:from foo import (bar, baz)。PEP 328没有说明格式化。
Max Malysh '18年

好的,我明白您现在的意思了:)
甘道夫·萨克斯

-4

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

PEP 8没有列出这种情况下的任何约定,因此我想您应该决定什么是最佳选择。一切都与可读性有关,因此请选择任何可以使您清楚地表明要从单个模块导入内容的东西。

由于在您的范围内提供了所有这些名称,因此我个人认为选项2最清晰,因为您可以看到最佳的导入名称。然后,您甚至可以将其拆分成更多的部分,以将彼此属于的那些名称组合在一起。在您的示例中,我可能将和分开放置Tk,因为它们将小部件分组在一起,而将和分开放置则是它们在视图中较小的组件。FrameCanvasButtonText


10
永远无法从X导入中使用*
Tolo Palmer

1
@ToloPalmer通常是正确的,但是对于Tkinter来说通常没问题,因为您仅导入小部件;它甚至在库参考中以这种方式列出。而且,如果您将导入列为第一个导入,则应特别注意避免发生任何冲突。

1
作为参考,from X import *即使对于使用__all__正确的软件包,甚至存在问题,就是静态代码分析器pyflakes无法检测未定义的名称,import *因为它必须假设任何未定义的名称可能是由导入的*
RubenLaguna 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.