导入是否会以某种方式超越模块命名空间?

时间:2018-04-04 22:18:04

标签: python python-3.x import beautifulsoup python-module

我有一个模块(比如模块A),对于其中一个函数,它返回一个BeautifulSoup对象。我正在编写第二个模块(模块B),它调用此函数并存储BeautifulSoup对象。我很困惑如何在模块B中模块A返回的对象上调用BeautifulSoup函数,而模块B没有从bs4导入任何东西,或者必须通过模块A访问那些BS4函数。导入基本上是放置module_a及其所有的在包中导入,因此对于module_b?

可以看到BeautifulSoup类

module_a.py

from bs4 import BeautifulSoup
def function():
    some_xml = "<name>Namespaces are strange.</name>"
    return BeautifulSoup(some_xml, "xml")

module_b.py

import module_a
def main():
    # How does this line know what to do with .find()? or .string?
    print(module_a.function().find("name").string) 

1 个答案:

答案 0 :(得分:2)

这就像python这样的动态语言之美。 module_a.function()告诉python:

  • 转到模块a
  • 查找名为“function”的函数并将其命名为
  • 获取返回的对象,查找“find”并将其命名为
  • 获取返回的对象,查找“string”并将其命名为

由于所有这些查找都是在调用函数或方法时动态发生的,因此module_b不必具有bs4string的预定义接口。它只是寻找一种可以来自任何地方的“查找”方法。事实上,module_a可以交换其他一些实现,只要被调用的方法仍然存在,它仍然有效。

from bs4 import BeautifulSoupbs4模块(以及任何 it 导入的子模块)导入python。完成后,您可以在sys.modules中看到该模块。然后它会进入bs4,查找BeautifulSoup并将该类添加到module_a的命名空间。该模块现在可用于所有其他导入的模块......只是因为他们没有导入它而他们不知道它。仅使用bs4中的结果对象的模块永远不需要直接看到它。