【问题标题】:Loading a module with a dependent class加载具有依赖类的模块
【发布时间】:2017-07-17 15:53:12
【问题描述】:

我是 Python 新手,如果我在写这个问题时没有使用正确的语言,我深表歉意。我在 Windows 机器上使用 Python 3.6.1。我提供了一个我遇到的问题的工作示例。

假设我编写了一个保存在文件 Demo_func.py 中的模块。它包含以下功能:

def chebyshev_nodes(degree, domain):
    return Chebyshev.basis(degree,domain).roots()

然后我运行以下脚本:

from numpy.polynomial.chebyshev import Chebyshev
from Demo_func import chebyshev_nodes

chebyshev_nodes(5, [1,5])

它会产生这个错误:

NameError: 名称“Chebyshev”未定义

如果我改为在我的脚本中编写函数 chebyshev_nodes,如下所示,那么它工作得很好。

from numpy.polynomial.chebyshev import Chebyshev
def chebyshev_nodes(degree, domain):
    return Chebyshev.basis(degree,domain).roots()

chebyshev_nodes(5, [1,5])

我的理解是进口切比雪夫是全球性的。但不知何故,这确实在我的模块 Demo_func 中运行。如何编写依赖于 Chebyshev 类的模块?

【问题讨论】:

  • “我的理解是导入 Chebyshev 是全球性的” - 它不是。它执行的模块初始化是全局的,但它只使 Chebyshev 名称可用于执行导入的作用域。
  • 谢谢,这很有帮助。在函数定义中导入 Chebyshev 是可行的。这是正确的方法吗?

标签: python class import module


【解决方案1】:

正如 user2357112 在上面的评论中指出的那样,模块是全局初始化的,但名称不是。解决方案是在 Demo_func.py 文件的函数中加载 Chebyshez 类。

def chebyshev_nodes(degree, domain):
    from numpy.polynomial.chebyshev import Chebyshev
    return Chebyshev.basis(degree,domain).roots()

【讨论】:

  • 很抱歉,这是一个错误的答案。虽然它会起作用,但没有理由在函数体内导入Chebyshev。它可以并且应该在模块Demo_func 的范围内导入。此示例中没有循环导入问题,因此在函数体中导入等变通方法只会混淆代码。循环导入表明项目布局设计不佳。不要误会我的意思。我不会提供另一个答案来获得声誉。将导入放在应有的位置(因为你知道),然后我将我的 -1 更改为 +1。
  • 谢谢。我删除了答案标签。我不关心虚拟声誉。我提供了回复,因为我讨厌让事情未完成。我仍在学习类、范围和命名空间的过程中,主要是通过反复试验。我从您的评论中了解到,我可以在Demo_func.py文件的顶部导入Chebyshev。它有效,正如你所说,这更干净。我之前尝试过,但我认为它不起作用,因为我没有重新启动内核。经验教训。
猜你喜欢
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 2014-01-27
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多