2017-07-17 80 views
0

我是Python新手,如果在编写此问题时没有使用适当的白话,我表示歉意。我在Windows机器上使用Python 3.6.1。我提供了我遇到的问题的一个工作示例。加载具有相关类的模块

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

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

我然后运行下面的脚本:如果不是我写我的脚本中的函数chebyshev_nodes

NameError: name 'Chebyshev' is not defined

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

chebyshev_nodes(5, [1,5]) 

它产生这个错误下面,那么它工作得很好。

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类的模块?

+1

“我的理解是,进口切比雪夫是全球性的” - 事实并非如此。它执行的模块初始化是全局性的,但它只会使'Chebyshev'名称可用于执行导入的范围。 – user2357112

+0

谢谢,这很有帮助。在函数定义中导入Chebyshev。这是做到这一点的正确方法吗? –

回答

-1

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

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

对不起,但这是一个错误的答案。虽然它可以工作,但没有任何理由在函数体内导入'Chebyshev'。它可以并应该在模块'Demo_func'的范围内导入。在这个例子中没有循环导入问题,所以像函数体中的导入这样的变通办法只会模糊代码。而且通道的进口表明项目布局设计不好。不要误解我的意思。我不打算提供另一个获得声望的答案。把导入放在它应该是的地方(让你知道它)然后我把-1改成+1。 – ElmoVanKielmo

+1

谢谢。我删除了答案标签。我并不关心虚拟声誉。我提供了一个回应,因为我讨厌让事情没有完成。 我仍然在学习如何类,范围和命名空间,主要是由试验和错误。我从你的评论中了解到,我可以在'Demo_func.py'文件的顶部导入'Chebyshev'。它的工作原理和你说的更清洁。我曾尝试过,但我认为它没有工作,因为我没有重新启动内核。学过的知识。 –