【问题标题】:Is there a way to give parts of the local namespace to an importee?有没有办法将本地命名空间的一部分提供给导入者?
【发布时间】:2011-07-02 15:26:07
【问题描述】:

a.py:

import b
import c
...
import z

class Foo(object):
    ...

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

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

【问题讨论】:

  • 我不明白你在问什么。可以发一些代码来说明一下吗?
  • 把帖子编辑得尽可能清晰,我还是看不懂。您应该编辑问题并说出您真正想做的事情。

标签: python import namespaces


【解决方案1】:

没有。他们必须依次导入A自己。

【讨论】:

  • @JBernardo:不在 Python 中。如果处理得当,是可以解决的。
【解决方案2】:

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

通常,只使用经典导入。

如果模块变得太大,或者如果您有充分的理由将其拆分但希望共享相同的命名空间,您可以将值“提升”到虚拟命名空间中。例如,如果我有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 例如,如果你在foo.py 的函数中引用Bar,一切都很好,因为你没有'不要立即使用该值。但是,如果您在foo.py 中执行x = Bar,则该值可能尚未定义!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-23
    • 2016-06-23
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多