有没有办法将部分本地命名空间提供给importee?

时间:2011-07-02 15:26:07

标签: python import namespaces

a.py:

import b
import c
...
import z

class Foo(object):
    ...

每个模块B-Z需要使用类foo。

某种方式,如导入,允许间接访问(例如通过对象)所有模块A-Z的所有值,同时仍然允许每个模块B-Z访问A的命名空间(例如foo)。

2 个答案:

答案 0 :(得分:2)

没有。他们每个人必须自己导入A

答案 1 :(得分:2)

我仍然不知道你要做什么甚至询问,但这是我最好的猜测:

通常,只使用经典导入。

IF 模块越来越大,或者如果您有充分的理由将事情分开但希望共享相同的命名空间,则可以将值“提升”到虚拟命名空间中。例如,如果我有widget.Foowidget.Bar并希望它们位于不同的文件中,但我希望能够在每个文件中键入FooBar,我通常会到from widget import Foofrom widget import Bar。如果您有许多这些文件(foo.py,bar.py,baz.py,...,zeta.py),它可能会有点笨拙。因此,您只需在widget/__init__.py中导入一次,然后在一次的每个文件夹中导航from foo import *, from bar import *, ...,然后只在from widget import *进行一次,就可以改善您的情况每个模块。你已经完成了......好吧......差不多......

这会让你进入一个循环的导入场景,你必须非常小心:Circular (or cyclic) imports in Python如果你在Bar的函数中引用foo.py,那就没问题,一切都很好,因为你没有立即使用该值。但是,如果您在x = Bar中执行foo.py,则可能尚未定义该值!

旁注:您可以使用__import__函数以编程方式导入。如果您将此与os.walk结合使用,则可以避免必须为窗口小部件文件夹中的每个文件键入from ... import *。这是避免错误的关键和必要步骤。