Eu tenho uma estrutura do Django assim (mostrando apenas libs):
project/lib/ # Global libraries that will be used cross apps
project/lib/global_stuff.py
project/apps/app1/lib/special_for_app1.py
project/apps/app2/lib/special_for_app2.py
Alguns aplicativos não possuem uma pasta lib.
from apps.app1.lib import special_for_app1
funciona bem. Mas como posso importar da pasta lib global quando estou dentro de uma pasta que já contém uma pasta lib local?
De dentro do arquivo views.py de aplicativos em um dos aplicativos:
from lib import global_stuff
Me dá ImportError: cannot import name global_stuff
de .lib import global_stuff
Me dá ImportError: cannot import name global_stuff
from ..lib import global_stuff
Me dá ImportError: No module named lib
from ...lib import global_stuff
Me dá ValueError: Attempted relative import beyond toplevel package
from project.lib import global_stuff
Funciona, mas eu realmente não quero ficar preso usando o próprio nome do projeto na importação.
Existe alguma maneira de resolver isso, não usando o nome do projeto na importação ou alterando toda a idéia de lib.
Ou há alguma outra boa prática para armazenar a parte principal do código?
Respostas:
4 para resposta № 1Você está correto em não querer associar o nome do projeto às importações, portanto, há um padrão comum para isso:
project/
|__/source/
| |__/lib/
| |__/app/
|__/deployment/ # code for your production deployment maybe
|
|__/docs/
|__/tests/
|__README
|__requirements.txt
e coloque / path / to / project dentro de seus caminhos em seu virtualenv (você usa virtualenv certo?).
Então você pode fazer dentro do seu código
from source.lib.blah import foo
from source.app.baz import bar
EDIT: Isso só é ideal se você não lançar seu código como código aberto, é claro. Somente quando você tem um projeto interno, onde a gestão continua mudando o nome do projeto: D
3 para resposta № 2
Eu realmente não quero ficar preso usando o nome do projeto em si na importação
Por que não? É a melhor maneira. Note que "as importações relativas de importações intra-embalagem são altamente desencorajadas", - como disse no PEP-8.