【问题标题】:Spyder not recognising imported termsSpyder 无法识别导入的术语
【发布时间】:2017-11-14 10:08:36
【问题描述】:

我正在使用 Spyder 3.1.2 (Python 2.7.13)。作为启动的一部分,IPython 控制台设置为“Automatically load Pylab and NumPy modules”。

当我想使用 NumPy.zeros(shape) 方法时,我可以在 IPython 控制台中将其作为零调用:

In [12]: zeros(5)
Out[12]: array([ 0.,  0.,  0.,  0.,  0.])

我的问题来自于尝试从单独的 python 文件调用相同的 zeros 函数。

如果我在文件 Test1.py 中创建函数 UseZeros()

"""
filename: Test1.py
"""

def UseZeros():
    return zeros(4)

我从一个单独的文件 Test2.py 中调用它:

"""
filename: Test2.py
"""

import Test1

testArr1 = zeros(5)
testArr2 = Test1.UseZeros()

在此脚本中,testArr1 = zeros(5) 工作正常,但在调用 Test1.UseZeros() 时,我收到一条错误消息,指出未定义全局名称“zeros”。

文件“C:/Users/Gareth/Test2.py”,第 8 行,在 testArr2 = Test1.UseZeros()

文件“Test1.py”,第 7 行,在 UseZeros 中 返回零(4)

NameError:未定义全局名称“zeros”

有人能帮我理解为什么在调用此函数时,IPython 控制台不再识别该方法吗?

我能找到的对 similar problem 的唯一引用已在以前的版本中修复,并且与我所遇到的不同。

我需要这个工作的原因是我正在导入其他人使用的函数,这些人广泛使用了诸如 zeros、ones、sin、cos 等命令,我不想重新定义一切。

谢谢

【问题讨论】:

    标签: python numpy ipython spyder


    【解决方案1】:

    当您使用它时,import 语句仍然具有模块内命名的所有函数和类:例如,import numpy 将允许您以 numpy.ndarray 访问 ndarray 类。如果要将给定的类或函数导入顶级命名空间,则需要专门导入它:

    from numpy import ndarray
    

    如果你正在编写一些小东西并且不担心命名空间混乱,你可以这样做:

    from numpy import *
    

    在您的情况下,Spyder 的自动导入似乎只影响__main__ 级别的命名空间,因此您需要在任何导入的模块中放置正确的导入语句。

    【讨论】:

    • 嗨 Ben 感谢您的回复。问题是我不想修改我同事的代码。问题似乎不是导入,而是重新定义函数,例如 zeros=np.zeros、cos=np.cos 等。如果您将 zeros=np.zeros 添加到 Test1.py 我提供的代码有效希望有一种方法可以使用他的代码而不必添加所有导入和定义,因为我通常可以在不指定的情况下调用函数。
    • 你知道你的同事是怎么设置的吗?一般来说,我建议只调用np.zeros,它可以清楚地说明函数的定义位置/查找文档的位置。
    • 我同事的设置和我一样。但是从同一个 python 文件中调用他的方法。但是我想从我自己的 python 文件中调用他的方法,这就是我在更简单的示例中演示的问题所在。
    • 我认为除非您从同一个 python 文件中调用,否则不可能做到这一点。如果您愿意让您的代码无法维护,您可以复制粘贴。但是,如果您要共享这样的代码,您将希望拥有一个可以由你们双方统一导入的共享模块,否则您将无法长时间维护它。
    • 谢谢,是的,现在我已经复制粘贴了,但我期待更新。部分问题是即使我将相同的库和定义导入到我的 python 文件中,也会发生相同的错误。
    【解决方案2】:

    此处是 Spyder 开发人员自动加载 Pylab 和 NumPy 模块的选项是为了方便在控制台中进行交互工作,但这并不意味着在编辑器中编写代码因为该代码不会在 Spyder 之外运行。

    我不敢告诉你,但你的同事的做法是一种非常糟糕的做法,我认为你能做的最好的事情就是指导他/她解决这个问题。

    我们无法在 Spyder 方面解决/改善这种情况,因为我们不愿意推广不良做法,抱歉。

    【讨论】:

    • 感谢卡洛斯,感谢您的反馈。将为我的同事工作,这样我们就可以改用更传统的方式来组织工作。
    • 非常感谢您的理解,我知道解决这个问题可能需要您相当长的时间。
    • 完全没有,我主要担心我不能上班,这是应该的。很高兴发现它的设计不是那样工作的:)
    猜你喜欢
    • 2020-02-14
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-07
    • 2020-07-17
    • 2021-08-19
    相关资源
    最近更新 更多