所以这只是一个简单的问题。在python中导入模块时,有什么区别:
from module import a, b, c, d
和这个
from module import a
from module import b
from module import c
from module import d
对我而言总是有意义地压缩代码并使用第一个例子,但是我已经看到了第二个代码示例。是否存在任何差异,或者是程序员的偏好是什么?
答案 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可读性指南冲突。
我的喜好是
以上所述为您提供了良好的平衡,因为读者仍然可以快速浏览依赖项,同时获得合理的紧凑性。
例如,
我的偏好
# 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。