Python: importando um sub-pacote ou sub-módulo

Tendo já usado pacotes simples, não esperava o problema que encontrei com pacotes aninhados. Aqui está…

Layout do diretório
dir
 |
 +-- test.py
 |
 +-- package
      |
      +-- __init__.py
      |
      +-- subpackage
           |
           +-- __init__.py
           |
           +-- module.py
Conteúdo denisso.py

Ambospackage/__init__.py epackage/subpackage/__init__.py estão vazios.

Conteúdo demodule.py
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
Conteúdo detest.py (3 versões)Versão 1
# file test.py
from package.subpackage.module import *
print attribute1 # OK

Essa é a maneira ruim e insegura de importar coisas (importar tudo em massa), mas funciona.

Versão 2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1

Uma maneira mais segura de importar, item por item, mas falha, o Python não quer isto: falha com a mensagem: "Nenhum módulo chamado módulo". Contudo …

# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here

… Diz<module 'package.subpackage.module' from '...'>. Então, isso é um módulo, mas isso não é um módulo / -P 8-O ... uh

Versão 3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK

Este aqui funciona. Então você é forçado a usar o prefixo de overkill o tempo todo ou usar o modo inseguro como na versão 1 e não permitido pelo Python para usar o modo prático seguro? A melhor maneira, que é segura e evitar o prefixo longo desnecessário, é a única que o Python rejeita? Isso é porque amaimport * ou porque adora prefixos exagerados (o que não ajuda a reforçar essa prática)?

Desculpe pelas palavras duras, mas isso é dois dias que eu estou tentando contornar esse comportamento idiota. A menos que eu esteja totalmente errado em algum lugar, isso vai me deixar com um sentimento de que algo está realmente quebrado no modelo de pacotes e sub-pacotes do Python.

Notas

Eu não quero confiar emsys.path, para evitar efeitos colaterais globais, nem*.pth arquivos, que são apenas outra maneira de jogarsys.path com os mesmos efeitos globais. Para que a solução esteja limpa, ela deve ser apenas local. Ou o Python é capaz de manipular o subpackage, ou não é, mas não deve precisar de uma configuração global para poder manipular o material local.Eu também tentei usar importações empackage/subpackage/__init__.py, mas não resolveu nada, faz o mesmo, e reclamasubpackage não é um módulo conhecido, enquantoprint subpackage diz que é um módulo (comportamento estranho, de novo).

Pode ser que eu esteja completamente errado (a opção que eu preferiria), mas isso me faz sentir muito desapontado com o Python.

Alguma outra maneira conhecida ao lado dos três que eu tentei? Algo que eu não conheço?

(suspiro)

-----% <----- editar ----->% -----

Conclusão até agora (depois dos comentários das pessoas)

Não há nada como um sub-pacote real em Python, já que todas as referências a pacotes vão apenas para um dictionnário global, o que significa que não há dicionário local, o que implica que não há como gerenciar a referência de pacote local.

Você tem que usar prefixo completo ou prefixo curto ou alias. Como em:

Versão completa do prefixo
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
Versão de prefixo curto (mas prefixo repetido)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place

Ou então, uma variação do acima.

from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
Versão fatorial

Se você não se importar em importar várias entidades de uma só vez em um lote, você pode:

from package.subpackage.module import attribute1, attribute2
# and etc.

Não no meu primeiro gosto favorito (eu prefiro ter uma declaração de importação por entidade importada), mas pode ser a que eu pessoalmente favorarei.

Atualização (2012-09-14):

Finalmente parece ser OK na prática, exceto com um comentário sobre o layout. Em vez do acima, eu usei:

from package.subpackage.module import (

    attribute1, 
    attribute2,
    attribute3,
    ...)  # and etc.

questionAnswers(3)

yourAnswerToTheQuestion