2011-07-02 30 views
-2

a.py:有没有办法将本地命名空间的一部分给一个importee?

import b 
import c 
... 
import z 

class Foo(object): 
    ... 

每个放入系统模块B-Z的需要使用类FOO。

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

+0

我不明白你在问什么。你能发表一些代码来说明吗? –

+0

编辑帖子后尽可能清楚,我还是不明白。你应该编辑问题并说出你真正想做的事情。 – ninjagecko

回答

2

不可以,他们必须依次自己进口A

+0

循环依赖关系==失败 – JBernardo

+1

@JBernardo:不在Python中。如果正确完成,可以解决。 –

+1

“__if done done __”... http://en.wikipedia.org/wiki/Anti-pattern – JBernardo

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这将是很好,例如,如果你参考Barfoo.py的函数中,一切都很好,因为您不会立即使用该值。但是,如果您在foo.py中执行x = Bar,那么该值可能尚未定义!

旁注:您可以使用__import__函数以编程方式导入。如果您将其与os.walk耦合,那么您可以避免为widget文件夹中的每个文件键入from ... import *。这是避免错误的重要步骤。

相关问题