开发者

Can someone explain this odd Python/Django import behaviour?

I have a project where the directory structure looks like:

mywebsite/
    manage.py
    __init__.py
    myapp/
        models/
            __init__.py
            base.py

myapp/models/base.py contains:

class X(object):
    pass

myapp/models/__init__.py contains:

from base import X

Now, if I do manage.py shell I can have the following session:

> import mywebsite.myapp.models
> import myapp.models
> mywebsit开发者_如何学Pythone.myapp.models.X == myapp.models.X
False

However if I change myapp/models/__init__.py to be:

from myapp.models.base import X

Then I get True as expected.

I think I am missing something about how imports work or how Django changes paths when using manage.py shell.

Can anyone explain this?


When you open a Django shell, it adds the path to your project to sys.path. You can see this by running import sys; print sys.path on a Django shell and on a normal python shell and comparing the output. You will note that the output from the Django shell includes the path to the mywebsite directory as the first item of the list.

Basically, it means that the two imports create two different module objects, since they are gotten from different points in the search path. The comparison check returns False since the module objects have different id's (memory address)

# These two values will be different
id(mywebsite.myapp.models)
id(myapp.models)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜