为什么我可以在定义之前调用一个函数,只有一个警告?

时间:2015-08-27 17:13:25

标签: python function spyder

在其他语言中,我经常做这样的事情:

someFunc()

someFunc() {
  // This is my function
}

这样我可以将所有函数堆叠在文件中较低的位置,但是将函数调用放在顶部。现在我对所发生的一切都有一个很好的概述。

然而,当我在Spyder的Python 3中做到这一点时,我收到了警告未定义名称:' myfunc'

my_func("Some string")

def my_func(some_var):
  print(some_var)

代码工作正常,但我不确定这里的最佳做法。我的方法是否会产生任何负面影响?或者它只是在你打电话之前获得你的功能的指南?

我在上面设置的代码为我工作。这是为什么?我和Anaconda一起运行Python 3.4.3。我的版本有什么不同?或者是因为我在Spyder中运行它?

编辑:显然Spyder以神秘的方式工作。首先,我在定义后进行了调用,然后我将调用交换到第一行,它仍然有效。 Spyder似乎缓存功能或者至少不会将它们清除掉。 (虽然我不确定Spyder是否正在进行缓存或Python本身。我正在考虑使用Python。)对于任何想知道这一点的新手:解决方案是重启你的程序和/或Python服务。

2 个答案:

答案 0 :(得分:5)

这在标准Python构建中不起作用,因为文件是按顺序解析的。您引用的其他语言是编译的(在传统意义上,不是JIT或任何东西),因此顺序并不重要,但Python要求首先要做的事情。

定义/分配/创建/等。使用它们之前的事情。

答案 1 :(得分:1)

来自my own comment

  

尝试重新启动翻译,也许您之前已经意外定义了my_func

another one

  

代码本身并不起作用。您很可能已经在同一个REPL会话中提前定义my_func,尝试重新启动您的IDLE或者您正在使用它。除非您已经做过其他事情,否则代码不起作用。

事实证明,这就是问题所在,你的IDE在某种程度上是"缓存"该会话期间早期的函数定义。

一般情况下,当你经常遇到没有意义并且不应该首先出现的奇怪问题时(比如这个),你应该重新启动你的IDE。它通常会解决问题,而问题就像缓存一样愚蠢。

此外,在使用CPython the default, most widely used implementation of the Python programming language时,您使用Python作为解释语言,因此您的解释器将按照从上到下的顺序浏览代码。这就是为什么在用Python定义函数之前通常无法调用函数的原因。