【问题标题】:Why can you reference an imported module using the importing module in python为什么可以使用python中的导入模块来引用导入的模块
【发布时间】:2011-01-25 06:58:10
【问题描述】:

我试图理解为什么可以使用导入模块引用任何导入,例如

#module master.py
import slave

然后

>>>import master
>>>print master.slave

给予 <module 'slave' from 'C:\Documents and Settings....'>

该功能的目的是什么?我可以看到它在包的__init__.py 文件中有何帮助,但没有别的。每个导入都添加到模块的命名空间并且模块的命名空间从外部可见,这是一个副作用吗?如果是这样,为什么他们不对从其他模块导入的数据进行例外处理(例如,不要将其显示为其他模块的模块名称空间的一部分)?

【问题讨论】:

    标签: python import namespaces module


    【解决方案1】:

    这是一个副作用,但可以有目的地使用,例如os.pyposixpathntpath 导入为path 以创建os.path

    【讨论】:

    • 但是即使在一个导入不是从外部自动可见的世界中,您也可以通过执行 os.path=posixpath 使它们显式可见,即定义一个名为 path 的变量并分配 posixpath给它。
    • @noam:没错。核心开发者会浪费精力去破例,然后那些不喜欢墙的人会翻过它,在它下面挖隧道,或者只是在它的尽头骑自行车。最好不要一开始就有墙。你有没有注意到不做例外的任何不利影响?
    • @John Machin:当建议混淆以两个下划线开头的任何类成员的建议摆在桌面上时,您可能会使用完全相同的论点 - 人们仍然可以“在它下面挖隧道”,即使用_ClassName__成员名。我相信你知道这个模糊的原因。是的,我有一个有问题的例子:通常一个模块只想向公众公开它的相关部分,但在这里你也公开它使用的模块:os.path='hello world(为什么不让它更难有人像那样切换一个模块的导入?)
    • @noam:如果某个白痴想做 os.path = hismodule,那是他的问题,他的应用程序,他的电脑。我们为什么要关心?无论如何,这是一个供需要帮助的人使用的论坛,而不是讨价还价的论坛。别担心了,好吗?
    • Python 不喜欢限制你,除非它必须这样做。其他语言在 Python 没有的地方设置了护栏。它如此灵活的部分原因。
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多