Como passar importação de biblioteca para classes?

Novamente estou aqui.

Dessa vez estou estudando importar bibliotecas para classes e o funcionamento do import.

Fiz então esse código para testar os comportamentos:

Quando vou rodar, dá o erro

datetime is note defined

Vendo assim, eu sei que esse problema acontece pois no arquivo da direita não tem importado o datetime.

Eu resolveria isso escrevendo acima de “MyClass”

import datetime

Mas acho isso feio(Peço ajuda aqui. Eu tendo a ser preciosista demais, não sei se isso é bom ou ruim..)

É aceitável e “correto” fazer o que sugeri, de importar no arquivo onde está escrita a classe ou tem como importar no arquivo main?

Obrigado mais uma vez.

P.S

Não gostaria de ficar enchendo vocês mas essas questões desse tipo, eu não sei onde pesquisar. É mais algo de “boas maneiras”. Alguém indica algum projeto ( não tão complexo) no qual eu poderia ir comparando ?

é exatamente isso que vc tem que fazer, o arquivo da sua classe não sabe oq é datetime, então vc tem que importar no arquivo sim

(eu acredito, não sou nenhum expert me corrijam por favor se for o caso)

1 curtida

Pensava que tinha alguma forma melhor. Eu achei que poluiu o arquivo. Antes eu continha apenas a classe…

Obrigado.

é só impressão sua pq talvez não tenha lido muito código ainda, os imports todos no topo do arquivo deixa tudo super organizado e no futuro vc estará bem habituado com isso

1 curtida

É basicamente isso. Ou você faz a importação (que é o que deixa o código clean) ou você escreve todo o código ali, o que vai deixar uma bagunça maior. Até onde eu entendo, não há outro método senão esses dois.

1 curtida

Eu tinha testado uma coisa e deu certo, mas decidi não usar mesmo. Tinha feito isso:

Mas terminei abandonando. Fica meio estranho. O legal disso é que se tiver umas 20 classes nas quais precise importar datetime, bastava passar como parâmetro.

Embora, no final das contas isso iria aumentar o código dentro de cada classe.

Você deve ser organizado e deve procurar evitar inconsistências e incongruências na organização do seu código ao máximo, sob todos os aspectos. Isso torna fácil para todos entenderem o seu código e para você entender o código dos outros, um ponto fundamental disso são as convenções de uma linguagem, como nomenclatura de métodos, atributos, classes, pacotes, espaçamento entre métodos, indentação, espaçamento entre termos, organização de pacotes, classes métodos, etc.

Uma dessas convenções em Python é sempre que possível usar importações parciais no topo do arquivo. Isso ajuda a evitar problemas como:

  • Tentativa de usar uma biblioteca antes de ela ser declarada.
  • Tentativa de usar uma biblioteca inacessível do atual escopo em que seu código se encontra.
  • Importar o mesmo componente mais de uma vez.
  • Importar código que não será usado.
  • importação circular (A importa B que importa A)

Estes problemas podem transformar o seu código em um “espaguete”, gerar inconsistências no código, pacotes para distribuição desnecessariamente grandes, impactar na performance fazendo a VM resolver dependências mais de uma vez, ocupar memória com objetos duplicados, etc.


Alias datetime é um bom exemplo de uma biblioteca antiga que causa um pouco de confusão na hora de estudar como estruturar projetos em Python. A convenção é, em classes, palavras iniciam com maiúsculo no estilo CamelCase e pacotes/módulos em minúsculo com sublinhado entre palavras se ajudar na legibilidade.

# arr... datetime é uma classe do pacote datetime... confuso
from datetime import datetime as DateTime

def blablabla():
    ... new DateTime()
    ... DateTime.now() # Factory Pattern
    

Porque é assim? Retrocompatibilidade importa mais… Muitos destes pacotes surgiram antes da estabilização de um guideline sólido e até mesmo antes de diversas funcionalidade modernas do Python 2 e 3.

Você pode encontrar mais informações sobre o styleguide do Python em:

2 curtidas