【问题标题】:Do imports somehow transcend module namespaces?导入是否以某种方式超越了模块名称空间?
【发布时间】:2018-09-14 14:55:31
【问题描述】:

我有一个模块(比如模块 A),它的一个功能返回一个 BeautifulSoup 对象。我正在编写第二个模块(模块 B),它调用此函数并存储该 BeautifulSoup 对象。我很困惑如何在模块 B 中的模块 A 返回的对象上调用 BeautifulSoup 函数,而无需模块 B 从 bs4 导入任何内容,或者必须通过模块 A 访问这些 BS4 函数。导入基本上是把 module_a 及其所有在包中导入,所以 BeautifulSoup 类对 module_b 是可见的?

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) 

【问题讨论】:

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


    【解决方案1】:

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

    • 转到模块a
    • 查找一个名为“function”的函数并调用它
    • 获取返回的对象,查找“find”并调用它
    • 获取返回的对象,查找“字符串”并调用它

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

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

    【讨论】:

    • 太棒了,谢谢。我来自 Java 背景,所以我已经接受了一些 python 的东西会在一段时间内变得神奇。
    猜你喜欢
    • 2022-11-29
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多