Mam projektu Pythona o następującej strukturze:Dlaczego forma Pythona "z" instrukcji import może wiązać nazwę modułu?
testapp/
├── __init__.py
├── api
│ ├── __init__.py
│ └── utils.py
└── utils.py
Wszystkie moduły są puste z wyjątkiem testapp/api/__init__.py
, który posiada następujący kod:
from testapp import utils
print "a", utils
from testapp.api.utils import x
print "b", utils
i testapp/api/utils.py
który definiuje x
:
x = 1
Teraz z katalogu głównego importuję testapp.api
:
$ export PYTHONPATH=$PYTHONPATH:.
$ python -c "import testapp.api"
a <module 'testapp.utils' from 'testapp/utils.pyc'>
b <module 'testapp.api.utils' from 'testapp/api/utils.pyc'>
Wynik importu zaskakuje mnie, ponieważ pokazuje, że drugi import
oświadczenie jest zastępowane utils
. Jeszcze docs stwierdzić, że from statement will not bind a module name:
FROM formularza nie wiąże nazwę modułu: to przechodzi listy identyfikatorów, wygląda każdy z nich się w module znaleziony w kroku (1), i wiąże nazwę w lokalnej przestrzeni nazw z obiektem, który został znaleziony.
I rzeczywiście, kiedy w terminalu używam from ... import ...
oświadczenie, bez nazwy modułów są wprowadzane:
>>> from os.path import abspath
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
I podejrzewam, że ma do czynienia z Pythona, w czasie drugiej instrukcji import, próbuje importować testapp.api.utils
, który odnosi się do testapp.utils
i nie, ale nie jestem pewien.
Co się tutaj dzieje?
Nie spodziewałbym się takiego zachowania i nie mogę się doczekać odpowiedzi. – ballsatballsdotballs
możesz dodać kod z różnych plików utils? –
@NikosM. jak już wspomniałem, wszystkie pozostałe pliki są puste. –