【问题标题】:Is there anything bad about having multiple imports on one line?一条线上有多个导入有什么不好的吗?
【发布时间】:2014-06-17 19:35:51
【问题描述】:

当我在 Python 中编程并且需要导入多个模块时,我通常会这样做:

import random, time, matplotlib, cheese, doge

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

import random
import time
import matplotlib
import cheese
import doge

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

【问题讨论】:

  • 我回答说每行一个导入有很多好处 - 其中大部分解决了维护每行多个导入的代码的问题,特别是在大型 Python 代码库中。

标签: python import


【解决方案1】:

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

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

  • 导入更容易浏览/阅读

    • import fred 中比在import barney, betty, wilma, fred, bambam, pebbles 中更容易看到fred
  • 进口更容易定位

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

    • 在大多数编辑器中插入和删除整行都很快。
    • 每行只有一个模块,因此您无需在行中搜索即可找到要编辑的内容 - 它位于末尾。
    • 在模块中重新定位导入只是移动了整行。
    • 将几个导入中的一个复制到另一个 Python 模块是复制粘贴一行, 而不是复制粘贴,然后修剪掉您不想要的其他导入。
  • 导入更容易维护

    • 每个更改的模块在更改集中都有自己的行 - 您无需阅读一行即可确定哪些模块或哪些模块发生了更改。
    • 缺少和添加的模块会影响文件和变更集中的行数。
    • 在更改集的视觉浏览中,拼写错误更容易识别和更正。

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

【讨论】:

  • 我喜欢直觉,而不仅仅是参考 PEP8!
  • 我希望 PEP8 中至少有一些基本原理。您的理由很好(尽管我认为避免合并冲突至少同样重要)。不利的一面是,如果你很好地确定了导入的范围,你最终会得到导入总代码的很大一部分。 PEP8 中显示的两个导入还不错,但有时有 10 个。
【解决方案2】:

根据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 指南。

【讨论】:

  • 我通常更喜欢将我的所有导入放在一行,除非行字符数超过 80,只是为了让我的代码更短。以防我出于某种原因有 50 个导入。
  • 正确 - 我看到不少程序员这样做。这些指南是为开发人员带来全面一致性的一种方式。它们更多的是惯例-可以说是“错误”。根据我的经验/意见,遵循指南是个好主意。
  • 我也喜欢docs.openstack.org/developer/hacking关于导入的扩展。
  • @holdenweb 这样您就不必滚动很长时间才能看到代码的内容。
  • 所以大概是因为你不想滚动,所以在函数、类和方法之后不添加垂直空格? PEP8 提出了某些规则,旨在指导作者,但这不是铁的规则。如果您想做其他事情,那完全可以。我尽量不要太挑剔。代码需要做的第一件事就是工作!最小惊讶原则只是意味着遵循 PEP8 的代码可能会更容易被其他人阅读。
【解决方案3】:

我不喜欢没有正当理由的盲目跟风。正如 PEP20:Zen of Python 所说,“可读性很重要”

PEP8“每次导入单行”适用于一般视角。尽管我尊重他(即 Guido)的意见,但我不会一直严格遵守这些约定。

此规则的例外是仅当 # of code 小于 # of module import 时。例如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))

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

【讨论】:

  • 我有点同意。我也觉得单线真的很密集,也许应该被打破。对我来说,主要的一点是我几乎总是在维护代码,简单的导入更容易维护,即使它们很冗长。
【解决方案4】:

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

它被认为是好的风格,通常标准化使程序易于阅读。如果这就是您要问的,我认为在后台无需担心存在实质性差异。

【讨论】:

    【解决方案5】:

    这两个示例在功能上是等效的。然而,Python 的官方风格指南 PEP 8 有一个部分 here 谴责将多个导入放在一行中的做法:

    导入通常应该在单独的行上,例如: 是:导入操作系统 导入系统 否:导入系统、操作系统 不过可以这样说: 从子流程导入 Popen, PIPE

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-24
      • 2022-12-04
      • 1970-01-01
      • 2023-01-25
      • 2011-10-28
      • 2010-10-03
      • 1970-01-01
      相关资源
      最近更新 更多