我有一个模块(比如模块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)
答案 0 :(得分:2)
这就像python这样的动态语言之美。 module_a.function()
告诉python:
a
由于所有这些查找都是在调用函数或方法时动态发生的,因此module_b
不必具有bs4
或string
的预定义接口。它只是寻找一种可以来自任何地方的“查找”方法。事实上,module_a
可以交换其他一些实现,只要被调用的方法仍然存在,它仍然有效。
from bs4 import BeautifulSoup
将bs4
模块(以及任何 it 导入的子模块)导入python。完成后,您可以在sys.modules
中看到该模块。然后它会进入bs4
,查找BeautifulSoup
并将该类添加到module_a
的命名空间。该模块现在可用于所有其他导入的模块......只是因为他们没有导入它而他们不知道它。仅使用bs4
中的结果对象的模块永远不需要直接看到它。