Não sou muito claro sobre esse aspecto. Digamos que você tenha um monte de arquivos .py que são seus próprios módulos separados.
Por que cada arquivo .py precisa importar os outros quando eles usam essa classe? Ou eles? Porque eu tinha quase certeza de que outras linguagens (Java, por exemplo), não exigiam importação quando se referiam a classes / arquivos no mesmo diretório. Eu posso estar errado.
Como o python é interpretado, tudo o que você importa está disponível no prompt. Java (e C ++) têm uma etapa de compilação e link que pode pesquisar e incluir apenas funções usadas
Se tudo fosse importado automaticamente, haveria milhares de funções e variáveis e seria impossível digitar qualquer coisa sem colidir com uma.
edit: Ok, é um pouco mais do que apenas compilado versus interpretado. O Python pretende ser uma linguagem "baterias incluídas" - existem bibliotecas disponíveis para fazer quase tudo. Como você só usará uma pequena fração dessas pessoas, é preciso organizá-las para incluir apenas as que você precisa.
A importação da sintaxe é inteligente porque você pode importar a biblioteca inteira e manter nomes totalmente qualificados do tipo Java ou importar funções específicas (ou todas as funções) no espaço de nomes local
A segunda razão é especialmente importante em uma linguagem dinâmica como python. Como você não precisa definir variáveis antes de usá-las, seria difícil para o ambiente descobrir se
sin
é a função matemática ou uma variável sua em um intérprete.fonte
Imagine que você tinha esse código em python:
Obviamente, temos um erro de digitação e
fo
deveria ter sidofoo
. No momento, o python diz:Mas com o carregamento implícito de classe, pode-se dizer:
o que seria confuso. Pior ainda, se você digitasse incorretamente um nome de variável que por acaso era o nome de um módulo, você receberia um erro ainda mais confuso ao tentar tratar esse módulo como se fosse sua variável. Python não pode dizer se algo é um nome de classe, objeto ou qualquer outra coisa.
Java, por outro lado, acredito que pode distinguir da sintaxe se um determinado identificador se refere a uma classe ou outra coisa. Portanto, não há problema em produzir uma mensagem de erro apropriada.
No geral, ele se encaixa na filosofia Python de ser explícito e não implícito. Eles acham melhor importar explicitamente um módulo, em vez de importá-lo automaticamente. O problema da mensagem de erro é um fator que influencia a decisão.
Alguns sugeriram que haveria um grande custo de tempo de execução para importações implícitas. Acho que não. O que acontece é algo como isto:
Para suportar o carregamento implícito do módulo, poderíamos fazer:
import foo
Na primeira vez em que o módulo é usado, levaria um pouco mais de tempo, pois ele deve procurar outros dicionários primeiro. Mas essa é apenas a primeira vez e não deve ser significativa em termos de tempo de execução do programa.
Haveria um custo significativo, no caso de nomes de variáveis com erros ortográficos. Quando ocorrem, o python perde tempo lendo o disco tentando encontrar o módulo. Mas se isso acontecer, seu programa está prestes a morrer com um retorno, e o desempenho não é uma grande preocupação.
fonte
Existem algumas diferenças importantes entre Python e Java; enquanto o Java tem uma regra "uma classe por arquivo", o Python não. Além disso, nem tudo no Python é uma classe.
Portanto, um módulo pode ter classes, funções e simplesmente variáveis antigas - geralmente todas relacionadas de alguma forma (como funções aleatórias
random
, rotinas matemáticasmath
, constantes de stringstring
, etc).Se você quiser acessar qualquer uma das classes / funções / variáveis de um módulo específico, primeiro importe-o.
Por que isso é uma coisa boa?
math.sin
e suas própriassin
funções)fonte
Um dos conceitos mais importantes do Python é o de namespaces (faça isso
import this
imediatamente, para descobrir quais são os outros). Eu sei que os espaços para nome também existem em outros idiomas, mas no Python você só tem acesso ao espaço para nome atual, que é o que é definido no módulo atual. Para obter acesso a outros identificadores, é necessário importá-los para o espaço para nome atual: importando o módulo que os contém (aimport foo
sintaxe) ou os próprios nomes (from foo import bar
).fonte