在一条线上进行多次进口有什么不好吗?

时间:2014-06-17 19:35:52

标签: python import

当我用Python编程并且我需要导入多个模块时,我通常喜欢这个:

import random, time, matplotlib, cheese, doge

然后,当我阅读其他人的代码时,这就是我所看到的:

import random
import time
import matplotlib
import cheese
import doge

这是为什么?这两种风格有什么区别吗?

5 个答案:

答案 0 :(得分:19)

每行一次导入的做法在PEP8标准化,遵循一个共同的标准就足以像其他人那样做。遵循通用标准遵循Principle of Least Astonishment,使熟悉标准的人更容易阅读和修改您的代码。

即使您不关心PEP8,每行一次导入也可以使您的代码更易于维护。

  • 导入更容易浏览/阅读

    • 您可以更轻松地看到fred中的import fredimport barney, betty, wilma, fred, bambam, pebbles
    • 更容易
  • 导入更容易找到

    • 搜索“import fred”会找到import fredimport fred, wilma, pebbles,但找不到import barney, fred
  • 导入更容易编辑

    • 在大多数编辑器中插入和删除整行很快。
    • 每行只有一个模块,所以你不必在行中搜索你想要编辑的东西 - 它就在最后。
    • 重新定位模块内的导入只是整行。
    • 将多个导入中的一个复制到另一个Python模块是一行的复制粘贴, 而不是复制粘贴,然后修剪你不想要的其他导入。
  • 导入更容易维护

    • 每个更改的模块在更改集中都有自己的行 - 您不必读取一行来确定更改了哪个或哪些模块。
    • 缺少和添加的模块会影响文件和更改集中的行数。
    • 在更改集的视觉浏览中,Typos更容易挑选和纠正。

即使不是标准,每行一次导入也是一个好主意。因为它是标准,所以它是最好的方式。

答案 1 :(得分:13)

根据PEP-8(Python代码样式指南)

Imports should usually be on separate lines, for e.g

Yes: import os
     import sys

No:  import sys, os 

It's okay to say this though:

from subprocess import Popen, PIPE

回答你的问题 - 两者都可以正常工作,但有一条不符合PEP8指南。

答案 2 :(得分:5)

  

我不想在没有正当理由的情况下盲目追随。正如PEP20:Python的Zen声明" Readability Counts"

PEP8" 每次导入单行"适用于一般观点。虽然我尊重他(即圭多)的意见,但我并不总是严格遵守这些惯例。

此规则的例外情况仅在代码的#小于模块导入的#时。例如2行代码,但4个模块导入。

这更具可读性:(在我看来)

import os, sys, math, time

def add_special():
    return time.time() + math.floor(math.pow(sys.api_version + os.getpid(), 2))

而不是

import os
import sys
import math
import time

def add_special():
    return time.time() + math.floor(math.pow(sys.api_version + os.getpid(), 2))

但这种可读性问题因人而异。

答案 3 :(得分:0)

这两个例子在功能上是等价的。但是,PEP 8,Python的官方样式指南,有一个here部分,它谴责将多个导入放在一行上的做法:

Imports should usually be on separate lines, e.g.:

    Yes: import os
         import sys

    No:  import sys, os

It's okay to say this though:

    from subprocess import Popen, PIPE

因此,许多Python程序员每行只放置一个导入,以遵循本指南。

答案 4 :(得分:0)

官方Python样式指南PEP-8要求每行导入一个包或模块。

它被认为是好的风格,通常标准化使程序易于阅读。如果这就是你要问的话,我认为引擎盖下没有实质性的差异。