Meu pacote tem a seguinte estrutura:
mobilescouter/
__init__.py #1
mapper/
__init__.py #2
lxml/
__init__.py #3
vehiclemapper.py
vehiclefeaturemapper.py
vehiclefeaturesetmapper.py
...
basemapper.py
vehicle/
__init__.py #4
vehicle.py
vehiclefeature.py
vehiclefeaturemapper.py
...
Não tenho certeza de como os __init__.py
arquivos devem ser escritos corretamente.
Os __init__.py #1
parece:
__all__ = ['mapper', 'vehicle']
import mapper
import vehicle
Mas como deve ser, por exemplo __init__.py #2
? O meu é:
__all__ = ['basemapper', 'lxml']
from basemaper import *
import lxml
Quando deve ser __all__
usado?
Respostas:
__all__
é muito bom - ajuda a orientar as instruções de importação sem importar automaticamente os módulos http://docs.python.org/tutorial/modules.html#importing-from-a-packageusando
__all__
eimport *
é redundante, apenas__all__
é necessárioEu acho que uma das razões mais poderosas para usar
import *
em um__init__.py
pacote para importar é poder refatorar um script que cresceu em vários scripts sem quebrar um aplicativo existente. Mas se você estiver projetando um pacote desde o início. Eu acho que é melhor deixar os__init__.py
arquivos vazios.por exemplo:
então o aplicativo cresce e agora é uma pasta inteira
então o script init pode dizer
para que um script escrito para fazer o seguinte não seja interrompido durante a alteração:
fonte
__all__
eimport *
é redundante",__all__
é usado pelo consumidor do módulo, efrom foo import *
é usado pelo próprio módulo para usar outros ....using __all__ and import * is redundant, only __all__ is needed
Como são aqueles redundantes? Eles fazem coisas diferentes.Meus próprios
__init__.py
arquivos estão vazios com mais frequência do que não. Em particular, eu nunca tenho umfrom blah import *
como parte__init__.py
- se "importar o pacote" significa obter todos os tipos de classes, funções etc definidas diretamente como parte do pacote, então eu copiava lexicamente o conteúdo do conteúdoblah.py
para o pacote__init__.py
e o removiablah.py
( a multiplicação dos arquivos de origem não serve aqui).Se você insistir em apoiar os
import *
idiomas (eek), usar__all__
(com uma lista tão minúscula de nomes quanto possível) pode ajudar a controlar os danos. Em geral, namespaces e importações explícitas são boas , e eu sugiro reconsiderar qualquer abordagem baseada em ignorar sistematicamente um ou ambos os conceitos! -)fonte
import *
você deve aceitar incondicionalmente toda a estrutura em si, inclusive os recursos que você nunca usará. manter-se__init__.py
vazio oferece mais chances do que apenas a semântica de tudo ou nada. pense torcido.from mobilescouter import A, B
é apenas uma linha de código e você não tem um projeto com 666 classes e cada um com seu próprio arquivo, certo? se você tiver dois ou maisimport *
códigos, estará preenchendo o espaço para nome com um possível lixo e rapidamente esquecerá de ondeA
vem. E se um pacote superior fizer o mesmo? você está pegando todos os subpacotes e subpacotes. como o zen do python diz, explícito é melhor que implícito.Você
__init__.py
deve ter uma doutrina .Embora toda a funcionalidade seja implementada em módulos e subpacotes, a documentação do pacote é o local para documentar por onde começar. Por exemplo, considere o pacote python
email
. A documentação do pacote é uma introdução que descreve a finalidade, os antecedentes e como os vários componentes do pacote funcionam juntos. Se você gerar automaticamente a documentação a partir de docstrings usando sphinx ou outro pacote, a docstring do pacote é exatamente o lugar certo para descrever essa introdução.Para qualquer outro conteúdo, veja as excelentes respostas de firecrow e Alex Martelli .
fonte
__init__.py
doemail
pacote segue esta diretriz? Eu vejo uma única linha de doutrina que não ajuda muito a explicar "como os vários componentes do pacote funcionam juntos".