import辨析


                                                                                下文的分析以下面的文件结构为例:
a/
    __init__.py (内容A情况: b="BBB",B情况为空文件)
    b/
        __init__.py    (内容 “import c,os”)
        c.py               (内容“f=‘test’”)
1. import xxx: 从Python Reference Manual之6.12 The import statement可知 xxx必须为module,
而from yyy import zzz中,zzz只要是identifier即可,当然。
所以 import a.b.c.f 错误,from a import b.c也错误(因为b.c不是identifier),而from a.b.c import f 正确。import xxx as yyy同样要求yyy为identifier。
2. 所有被导入的module都被加入了sys.modules。执行了import a.b 后,sys.modules里会增加 a 键 以及 a.b 键,值分别为对应的module类型的对象,包含文件路径信息。
>>> a
>>> a.b
>>> a.__file__
'a/__init__.pyc'
如果module为package,则文件路径为对应的__init__.py文件。
另外:由于b包的__init__.py中import c,mutex,所以sys.modules还会增加a.b.c和a.b.mutex以及mutex键,但是他们有所不同,sys.modules中的键体现了在PYTHONPATH下的module 路径:
'a.b.mutex': None,
'mutex':
'a.b.c':
------
不过访问a.b.mutex则和预想中的相同(见3),
>>> a.b.mutex
>>> a.b.c
3. 执行 import a.b 的module的globals字典里只会增加 a 这个identifier(由import的语法可知,此处a.b为模块,所以情况A和B中并无不同),同时a的__dict__里会加入b键。
>>> a.__dict__['b']
4.import a后,
   (1)对情况A:a.b为“BBB”
   (2)对情况B:a.b则提示出错"AttributeError: 'module' object has no attribute 'b'"。因为在访问a.b时,系统会访问a的__dict__,但是只有import a.b(而不是import a)才会在sys.modules加入'a.b'键,才会在a.__dict__里加入b键!
5. 关于import的使用指导:
(1)How can I have modules that mutually import each other?
http://www.python.org/doc/faq/programming/#how-can-i-have-modules-that-mutually-import-each-other
(2)What are the "best practices" for using import in a module?
http://www.python.org/doc/faq/programming/#what-are-the-best-practices-for-using-import-in-a-module
[url=http://www.python.org/doc/faq/programming/#what-are-the-best-practices-for-using-import-in-a-module][/url]