ti-enxame.com

Python Importação do módulo: linha única vs multilinha

Portanto, esta é apenas uma pergunta simples. Em python ao importar módulos, qual é a diferença entre isso:

from module import a, b, c, d

e isto

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

Para mim, sempre faz sentido condensar código e usar o primeiro exemplo, mas eu tenho visto alguns exemplos de código por aí no segundo. Existe alguma diferença ou é tudo na preferência do programador?

49
Cody Brown

Não há nenhuma diferença. Ambos funcionam exatamente da mesma maneira.

No entanto, de uma perspectiva estilística, um pode ser mais preferível que o outro. E nessa nota, o PEP-8 para importações diz que você deve compactar from module import name1, name2 em uma única linha e deixe import module1 em várias linhas:

Yes: import os
     import sys

No:  import sys, os

Ok: from subprocess import Popen, PIPE

Em resposta ao comentário de @ teewuane (repetido aqui, caso o comentário seja excluído):

@ inspectorG4dget E se você precisar importar várias funções de um módulo e ele acabar fazendo essa linha com mais de 80 caracteres? Eu sei que a coisa de 80 caracteres é "quando torna o código mais legível", mas ainda estou me perguntando se existe uma maneira mais organizada de fazer isso. E não quero fazer o foo import *, embora esteja basicamente importando tudo.

O problema aqui é que fazer algo como o seguinte pode exceder o limite de 80 caracteres:

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

Para isso, tenho duas respostas (não vejo o PEP8 muito claro sobre isso):

Divida-o em duas importações :

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

Isso tem a desvantagem de que, se module for removido da base de código ou refatorado, as duas linhas de importação precisarão ser excluídas. Isso pode ser doloroso

Divida a linha :

Para atenuar a preocupação acima, pode ser mais sensato fazer

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

Isso resultaria em um erro se a segunda linha não fosse excluída junto com a primeira, mantendo a instrução de importação singular

79
inspectorG4dget

Para adicionar a algumas das perguntas levantadas em resposta do inspectorG4dget , você também pode usar tuplas para fazer importações de várias linhas quando as estruturas de pastas começarem a ficar profundamente aninhadas ou se você tiver módulos com nomes obtusos.

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,
)

Isso também funciona, embora eu não seja fã desse estilo:

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

Eu sugeriria não seguir o PEP-8 cegamente. Quando você tem cerca de meia tela de importações, as coisas começam a ficar desconfortáveis ​​e o PEP-8 entra em conflito com as diretrizes de legibilidade do PEP-20.

Minha preferência é

  1. Coloque todas as importações embutidas em uma linha, como sys, OS, time etc.
  2. Para outras importações, use uma linha por pacote (não módulo)

Acima, você obtém um bom equilíbrio, pois o leitor ainda pode ver rapidamente as dependências enquanto obtém compacto razoável.

Por exemplo,

Minha preferência

# 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

Recomendação 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
1
Shital Shah