O PEP 8 diz:
- As importações são sempre colocadas na parte superior do arquivo, logo após qualquer comentário e documentação do módulo, e antes das globais e constantes do módulo.
Na ocasião, violei o PEP 8. Algumas vezes, importo coisas dentro de funções. Como regra geral, faço isso se houver uma importação usada apenas em uma única função.
Alguma opinião?
EDIT (a razão pela qual sinto a importação de funções pode ser uma boa ideia):
Razão principal: pode tornar o código mais claro.
- Ao olhar para o código de uma função, eu poderia me perguntar: "O que é função / classe xxx?" (xxx sendo usado dentro da função). Se eu tiver todas as minhas importações na parte superior do módulo, preciso procurar lá para determinar o que é xxx. Este é mais um problema ao usar
from m import xxx
. Verm.xxx
na função provavelmente me diz mais. Dependendo do quem
é: É um módulo / pacote de nível superior bem conhecido (import m
)? Ou é um submódulo / pacote (from a.b.c import m
)? - Em alguns casos, ter essas informações extras ("O que é xxx?") Perto de onde xxx é usado pode facilitar a compreensão da função.
python
conventions
codeape
fonte
fonte
Respostas:
A longo prazo, acho que você apreciará ter a maior parte de suas importações na parte superior do arquivo, para que você possa ver rapidamente o quão complicado é o seu módulo pelo que ele precisa importar.
Se eu estiver adicionando novo código a um arquivo existente, normalmente faço a importação onde for necessário e, se o código permanecer, tornarei as coisas mais permanentes, movendo a linha de importação para a parte superior do arquivo.
Outro ponto, eu prefiro obter uma
ImportError
exceção antes de qualquer código ser executado - como uma verificação de integridade, por isso é outro motivo para importar na parte superior.Eu uso
pyChecker
para verificar se há módulos não utilizados.fonte
Há duas ocasiões em que eu viole o PEP 8 a esse respeito:
import pdb; pdb.set_trace()
Isso é útil porque eu não quero colocarimport pdb
no topo de todos os módulos que eu possa querer depurar e é fácil lembrar de remover a importação ao remover o ponto de interrupção.Fora desses dois casos, é uma boa ideia colocar tudo no topo. Isso torna as dependências mais claras.
fonte
Aqui estão os quatro casos de uso de importação que usamos
import
(efrom x import y
eimport x as y
) no topoOpções para importação. No topo.
Importação condicional. Usado com bibliotecas JSON, XML e similares. No topo.
Importação dinâmica. Até agora, temos apenas um exemplo disso.
Observe que essa importação dinâmica não traz código, mas traz estruturas de dados complexas escritas em Python. É como um dado em conserva, exceto que o coletamos manualmente.
Também está, mais ou menos, na parte superior de um módulo
Aqui está o que fazemos para tornar o código mais claro:
Mantenha os módulos curtos.
Se eu tiver todas as minhas importações na parte superior do módulo, preciso procurar lá para determinar o que é um nome. Se o módulo é curto, é fácil de fazer.
Em alguns casos, ter essas informações extras próximas de onde um nome é usado pode facilitar a compreensão da função. Se o módulo é curto, é fácil de fazer.
fonte
Um aspecto a ter em mente: importações desnecessárias podem causar problemas de desempenho. Portanto, se essa é uma função que será chamada com frequência, é melhor colocar a importação no topo. Claro que isso é uma otimização; portanto, se houver um caso válido de que importar dentro de uma função seja mais claro do que importar na parte superior de um arquivo, isso supera o desempenho na maioria dos casos.
Se você estiver usando o IronPython, me disseram que é melhor importar funções internas (já que a compilação de código no IronPython pode ser lenta). Assim, você pode conseguir uma maneira de importar funções internas. Mas, além disso, eu argumentaria que não vale a pena lutar contra convenções.
Outro ponto que eu gostaria de destacar é que esse pode ser um possível problema de manutenção. O que acontece se você adicionar uma função que usa um módulo que foi usado anteriormente por apenas uma função? Você vai se lembrar de adicionar a importação na parte superior do arquivo? Ou você vai verificar todas as funções em busca de importações?
FWIW, há casos em que faz sentido importar dentro de uma função. Por exemplo, se você deseja definir o idioma em cx_Oracle, é necessário definir uma
_
variável de ambiente NLS LANG antes de ser importada. Assim, você pode ver um código como este:fonte
Eu quebrei essa regra antes para módulos que são autotestes. Ou seja, eles normalmente são usados apenas para suporte, mas eu defino um main para eles, para que, se você os executar por si próprios, possa testar sua funcionalidade. Nesse caso, às vezes eu importo
getopt
ecmd
apenas no principal, porque quero que fique claro para alguém que está lendo o código que esses módulos não têm nada a ver com a operação normal do módulo e estão sendo incluídos apenas para teste.fonte
Vindo da pergunta sobre o carregamento do módulo duas vezes - Por que não os dois?
Uma importação na parte superior do script indicará as dependências e outra importação na função, tornando essa função mais atômica, enquanto aparentemente não causa nenhuma desvantagem no desempenho, uma vez que uma importação consecutiva é barata.
fonte
Contanto que seja
import
e nãofrom x import *
, você deve colocá-los no topo. Ele adiciona apenas um nome ao namespace global e você segue o PEP 8. Além disso, se precisar mais tarde em outro lugar, não precisará mudar nada.Não é grande coisa, mas como quase não há diferença, sugiro fazer o que o PEP 8 diz.
fonte
from x import *
dentro de uma função gerará um SyntaxWarning, pelo menos no 2.5.Dê uma olhada na abordagem alternativa usada no sqlalchemy: injeção de dependência:
Observe como a biblioteca importada é declarada em um decorador e passada como argumento para a função !
Essa abordagem torna o código mais limpo e também funciona 4,5 vezes mais rápido que um
import
declaração!Referência: https://gist.github.com/kolypto/589e84fbcfb6312532658df2fabdb796
fonte
Nos módulos que são 'normais' e podem ser executados (ou seja, possuem
if __name__ == '__main__':
seção), geralmente importo módulos que são usados apenas ao executar o módulo na seção principal.Exemplo:
fonte
Há outro caso (provavelmente "esquina") em que pode ser benéfico
import
funções raramente usadas: diminuir o tempo de inicialização.Eu bati nessa parede uma vez com um programa bastante complexo sendo executado em um pequeno servidor de IoT, aceitando comandos de uma linha serial e executando operações, possivelmente operações muito complexas.
Colocar
import
instruções no topo dos arquivos para que todas as importações sejam processadas antes do início do servidor; desdeimport
lista incluíajinja2
,lxml
,signxml
e outros "pesos pesados" (e SoC não era muito poderoso), isso significava minutos antes da primeira instrução foi realmente executado.OTOH colocando a maioria das importações em funções, consegui manter o servidor "ativo" na linha serial em segundos. É claro que quando os módulos foram realmente necessários, tive que pagar o preço (Nota: isso também pode ser mitigado gerando uma tarefa em segundo plano fazendo
import
s em tempo ocioso).fonte