在 Python 中导入模块时,这有什么区别:
from module import a, b, c, d
和这个
from module import a
from module import b
from module import c
from module import d
对我来说,压缩代码并使用第一个示例总是有意义的,但是我已经看到了一些代码示例和第二个示例。有什么区别,还是程序员的偏好?
完全没有区别。它们的功能完全相同。
然而,从风格的角度来看,一个可能比另一个更可取。在那一点上,用于导入的 PEP-8表示您应该压缩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
如果第二行没有与第一行一起删除,这将导致错误,同时仍保留单数 import 语句
要添加从inspectorG4dget 的回答中提出的一些问题,您还可以在文件夹结构开始深度嵌套或您的模块具有钝名称时使用元组进行多行导入。
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)
我建议不要盲目遵循 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
其他答案未提及的一个问题是 git merge 冲突。
假设您从这个 import 语句开始:
import os
如果将此行更改为import os, sys
在一个分支和import json, os
另一个分支中,则在尝试合并它们时会出现此冲突:
<<<<<<< HEAD
import os, sys
=======
import json, os
>>>>>>> branch
但是如果你在单独的行上添加import sys
和import json
,你会得到一个没有冲突的很好的合并提交:
--- a/foo.py
+++ b/foo.py
@@@ -1,2 -1,2 +1,3 @@@
+ import json
import os
+import sys
如果将两个导入添加到同一位置,您仍然会遇到冲突,因为 git 不知道它们应该出现在哪个顺序中。因此,如果您使用 importtime
而不是json
,例如:
import os
<<<<<<< HEAD
import sys
=======
import time
>>>>>>> branch
尽管如此,在确实避免合并冲突的情况下,仍然值得坚持这种风格。
根据 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。
两者都是一样的。使用from module import a, b, c, d
.
如果您只想导入模块的一部分,请使用:
from module import a
如果您想从同一模块导入多个代码,请使用:
from module import a,b,c,d
当两者相同时,无需将所有内容都写在单独的行中。