【问题标题】:What is the concept of namespace when importing a function from another module?从另一个模块导入函数时命名空间的概念是什么?
【发布时间】:2019-10-18 11:30:52
【问题描述】:

main.py:

from module1 import some_function
x=10
some_function()

module1.py:

def some_function():
    print str(x)

当我执行main.py 时,它在 moduel1.py 中给出了一个错误,表明 x 不可用。

我的理解是在模块main.py 中使用from x import y 会在main.py 的本地命名空间中带来x.y 的定义/值。由于函数定义和变量 x 都在 main.py 的本地命名空间中,它应该可以正常工作。但这似乎是不正确的低估。那么这里的确切概念是什么?这个概念的官方 python 文档有链接吗?

【问题讨论】:

  • 这应该给出一个错误,some_function 首先不接受任何参数...
  • @deceze 这不是问题所在。他说,导入函数会引入当前命名空间,其中有一个变量x。为什么导入的函数不使用当前文件中的x
  • module1.py 中将def some_function(): 更改为def some_function(x):
  • 您对import 的假设是正确的。问题在于module1.py 中的函数定义。
  • 好吧,现在固定的代码示例并没有证明假设的问题......

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


【解决方案1】:

每个模块都有自己的全局命名空间。

from module1 import some_function
x=10
some_function()

some_function 在其定义中使用module1.x,但您在current 模块中设置x。这会起作用:

from module1 import some_function
import module1

module1.x = 10
some_function()

请注意,您不能使用from module1 import x,然后设置x = 10,因为import 只是将一个 名称x 初始化为与module1.x 具有相同的初始值; x = 10 然后给新变量一个新值。

【讨论】:

  • 是的,我知道第二部分是由于字符串是不可变的。关于答案的第一部分。请问有这个概念的官方python文档吗?
  • 第二部分与可变性无关。这纯粹是关于名称x 所属的范围。
【解决方案2】:

冒着听起来轻率的风险,规则很简单:如果名称尚未在模块中定义,则它根本不存在。

看看这个模块:

def some_function():
    print str(x)

它没有定义x,因此该名称在此模块中不存在。如果您在另一个 模块中定义x,它仍然不会存在于该模块中。即使您将此模块导入到定义x 的另一个模块中,x 仍然不会存在于 this 模块中。

没有“全局global”命名空间。每个模块都有自己的 global 命名空间。名称永远不会在模块之间隐式共享,它们必须始终显式导入。

唯一的例外是builtins,为方便起见,不需要显式导入。

【讨论】:

  • 谢谢。关于这个特定主题的最佳文档是哪一个?
  • 不确定,因为这是相当基本的。也许docs.python.org/3/tutorial/modules.html.
  • 我最近了解了关于导入和从导入的可变性概念,这非常有启发性。感谢您提供链接并且之前阅读过它,我没有找到任何具体的内容,例如您的回答方式。谢谢你。如果您碰巧遇到有关此主题的任何文档,请与我分享。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2018-03-16
  • 2018-01-05
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多