Ho un progetto pitone con la seguente struttura:Perché il formato `from` di Python di un'istruzione import può associare un nome di modulo?
testapp/
├── __init__.py
├── api
│ ├── __init__.py
│ └── utils.py
└── utils.py
Tutti i moduli sono vuote tranne testapp/api/__init__.py
che ha il codice seguente:
from testapp import utils
print "a", utils
from testapp.api.utils import x
print "b", utils
e testapp/api/utils.py
che definisce x
:
x = 1
Ora dalla radice importazione 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'>
Il risultato dell'importazione mi sorprende, perché dimostra che la seconda dichiarazione import
ha sovrascritto utils
. Eppure i documenti affermano che il from statement will not bind a module name:
L'dalla forma non vincola il nome del modulo: si passa attraverso l'elenco degli identificatori, sembra ognuno di loro nel modulo si trovano in fase (1), e associa il nome nello spazio dei nomi locale all'oggetto, quindi trovato .
E infatti, quando in un terminale Io uso una dichiarazione from ... import ...
, non siano introdotte nomi di modulo:
>>> from os.path import abspath
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
ho il sospetto che questo ha a che fare con Python, al momento della seconda dichiarazione di importazione, cercando di importare testapp.api.utils
che si riferisce a testapp.utils
e in mancanza, ma non sono sicuro.
Cosa sta succedendo qui?
Non mi sarei aspettato questo comportamento e sono ansioso di sentire anche la risposta. – ballsatballsdotballs
puoi aggiungere del codice dai vari file utils? –
@NikosM. come ho detto, tutti gli altri file sono vuoti. –