Python模块导入:单行与多行

Cod*_*own 53 python module

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

from module import a, b, c, d
Run Code Online (Sandbox Code Playgroud)

还有这个

from module import a
from module import b
from module import c
from module import d
Run Code Online (Sandbox Code Playgroud)

对我而言总是有意义地压缩代码并使用第一个例子,但是我已经看到了一些代码样本.是否存在任何差异,还是程序员的偏好?

ins*_*get 83

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

然而,从风格的角度来看,人们可能比另一个更优选.在这方面,进口PEP-8说你应该压缩from module import name1, name2到一条线并留import module1在多条线上:

Yes: import os
     import sys

No:  import sys, os

Ok: from subprocess import Popen, PIPE
Run Code Online (Sandbox Code Playgroud)

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

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

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

from module import func1, func2, func3, func4, func5
Run Code Online (Sandbox Code Playgroud)

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

将其分解为两个导入:

from module import func1, func2, func3
from module import func4, func5
Run Code Online (Sandbox Code Playgroud)

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

拆线:

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

from module import func1, func2, func3, \
     func4, func5
Run Code Online (Sandbox Code Playgroud)

如果第二行不与第一行一起删除,则会导致错误,同时仍保持单数import语句

  • @CodyBrown:"单行问题"< - 它们不是真正的问题; 更像风格指南.绝对没有任何要求跟随它们.您可能正在使用完全不同的样式指南的团队,在这种情况下,PEP-8变得完全不适用 (4认同)
  • @ inspectorG4dget如果你必须从一个模块导入多个函数并且最终使该行超过80个字符怎么办?我知道80 char的事情是"当它使代码更具可读性时",但我仍然想知道是否有更整洁的方法来做到这一点.而且我不想做`来自foo import*`,即使我基本上都是导入所有东西. (2认同)

小智 28

要添加从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,
)
Run Code Online (Sandbox Code Playgroud)

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

from module import (a_ton, of, modules, that_seem, to_keep, needing,
                    to_be, added, to_the_list, of_required_items)
Run Code Online (Sandbox Code Playgroud)

  • 就我个人而言,我发现这是我个人最喜欢的风格。它不需要转义换行符或冗余 (3认同)

Shi*_*hah 10

我建议不要盲目遵循 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)