Pergunta

Suponha que você tenha o seguinte

b
b/__init__.py
b/c
b/c/__init__.py
b/c/d
b/c/d/__init__.py

Em alguns pacotes python, se você import b, você só obter os símbolos definidos em b. Para acesso B.C., você tem que explicitamente import b.c ou from b import c. Em outras palavras, você tem que

import b
import b.c
import b.c.d
print b.c.d

Em outros casos, eu vi uma importação automática de todos os subpacotes. Isto significa que o código a seguir não produz um erro

import b
print b.c.d

porque b/__init__.py cuida de importar seus subpacotes. I tendem a preferir a primeira (explícita melhor do que implícito), e eu sempre usei, mas existem casos em que o segundo é o preferido para o primeiro?

Foi útil?

Solução

Eu gosto de namespaces - então eu acho que import b só deve conseguir o que é em si mesmo b (presumivelmente em b/__init__.py). Se há uma razão para segregar outra funcionalidade em b.c, b.c.d, ou o que quer, então é só import b não deve arrastar tudo em - se o "arrastar tudo em" acontecer, eu acho que sugere que a separação namespace foi provavelmente um falso um para começar. Claro, há exemplos, mesmo na biblioteca padrão (import os, então você pode usar os.path.join e afins), mas eles são antigos, até agora, essencialmente, "direitos adquiridos" coisas da maneira antes que o sistema de embalagem Python era maduro e estável. No novo código, eu fortemente recomendamos que um pacote deve não arrastar seus subpacotes para o passeio quando você importá-lo. (Do import this no Python rápida e contemplar a última linha mostra; -).

Outras dicas

__all__ = [seus Vars, funções, classes]

Use sintaxe acima em __init__.py pacote de b para as coisas de carga auto listados na dict. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top