Python模块导入:单行与多行

时间:2013-02-21 20:14:39

标签: python module

所以这只是一个简单的问题。在python中导入模块时,有什么区别:

from module import a, b, c, d

和这个

from module import a
from module import b
from module import c
from module import d

对我而言总是有意义地压缩代码并使用第一个例子,但是我已经看到了第二个代码示例。是否存在任何差异,或者是程序员的偏好是什么?

4 个答案:

答案 0 :(得分:76)

完全没有区别。它们的功能完全相同。

然而,从风格的角度来看,一个可能比另一个更优选。在该注释中,PEP-8 for imports表示您应将from module import name1, name2压缩到一行并将import module1保留在多行上:

Yes: import os
     import sys

No:  import sys, os

Ok: from subprocess import Popen, PIPE

回应@ teewuane的评论(如果评论被删除,重复此处):

  

@ inspectorG4dget如果必须从一个函数导入多个函数,该怎么办?   模块,它最终使该行超过80个字符?我知道   80 char的事情是“当它使代码更具可读性时”,但我   我仍然想知道是否有更整洁的方法来做到这一点。我没有   想要从foo import *做,即使我基本上是导入   一切。

这里的问题是,执行以下操作可能超过80个字符限制:

from module import func1, func2, func3, func4, func5

对此,我有两个回复(我没有看到PEP8对此过于清楚):

将其分解为两个导入

from module import func1, func2, func3
from module import func4, func5

这样做的缺点是,如果从代码库中删除module或以其他方式重构,则需要删除两个导入行。这可能会很痛苦

拆分

为了缓解上述问题,可能会更明智地做到

from module import func1, func2, func3, \
     func4, func5

如果第二行没有与第一行一起删除,这将导致错误,同时仍保持单数导入语句

答案 1 :(得分:25)

要添加inspectorG4dget's answer中提出的一些问题,当文件夹结构开始深层嵌套或者您的模块名称为钝名时,您还可以使用元组进行多行导入。

from some.module.submodule.that_has_long_names import (
    first_item,
    second_item,
    more_imported_items_with_really_enormously_long_names_that_might_be_too_descriptive,
    that_would_certainly_not_fit,
    on_one_line,
)

虽然我不是这种风格的粉丝,但这也有效:

from module import (a_ton, of, modules, that_seem, to_keep, needing,
                    to_be, added, to_the_list, of_required_items)

答案 2 :(得分:2)

我建议不要盲目关注PEP-8。当您有大约一半的进口屏幕时,事情开始变得不舒服,然后PEP-8与PEP-20可读性指南冲突。

我的喜好是

  1. 将所有内置导入文件放在sys,os,time等一行上。
  2. 对于其他进口,每个包装(而不是模块)使用一行

以上所述为您提供了良好的平衡,因为读者仍然可以快速浏览依赖项,同时获得合理的紧凑性。

例如,

我的偏好

# one line per package

import os, json, time, sys, math
import numpy as np
import torch, torch.nn as nn, torch.autograd, torch.nn.functional as F
from torchvision models, transforms

PEP-8建议

# one line per module or from ... import statement

import os
import json
import time
import sys
import math

import numpy as np

import torch
from torch import nn as nn, autograd, nn.functional as F
from torchvision import models, transforms

答案 3 :(得分:1)

根据 PEP 8 指南,导入通常应位于单独的行上。

# Wrong Use
import os, sys
# Correct Use
import os
import sys

有关更多基于导入的 PEP 8 违规和修复,请查看 https://ayush-raj-blogs.hashnode.dev/making-clean-pr-for-open-source-contributors-pep-8-style