为什么我可以在定义一个函数之前调用它,并且只有一个警告?
Why can I call a function before defining it, with only a warning?
在其他语言中我经常这样做:
someFunc()
someFunc() {
// This is my function
}
这样我就可以将所有函数堆叠在文件中较低的位置,但在顶部进行函数调用。现在我对正在发生的一切有了一个很好的了解。
但是,当我在 Spyder 中的 Python 3 中执行此操作时,我收到警告 Undefined name: 'myfunc'
my_func("Some string")
def my_func(some_var):
print(some_var)
代码运行良好,但我不确定这里的最佳实践是什么。我的方法有什么负面影响吗?或者它只是在调用函数之前拥有函数的指南?
我在上面设置的代码确实对我有用。这是为什么?我正在使用 Anaconda 运行ning Python 3.4.3。我的版本有什么不同?还是因为我 运行 它在 Spyder 中?
编辑:显然 Spyder 以神秘的方式工作。首先我在定义之后进行了调用,这有效,然后我将调用交换到第一行并且它仍然有效。 Spyder 似乎 缓存 函数或至少不会清除它们。 (虽然我不确定是 Spyder 在做缓存还是 Python 本身。我假设 Python。)对于任何想知道这个的新手:解决方案是重新启动你的程序 and/or Python 服务。
这在标准 Python 构建中不起作用,因为文件是按顺序解析的。你提到的其他语言都是编译的(传统意义上,不是 JIT 或任何东西),所以顺序无关紧要,但 Python 要求先到先得。
Define/assign/create/etc。使用它们之前的东西。
来自:
Try restarting your interpreter, maybe you've accidentally defined my_func
earlier on already?
和:
The code, as is, doesn't work. You've most likely defined my_func
earlier on already in the same REPL session, try restarting your IDLE or w/e you're using. The code doesn't work unless you've done something else already.
事实证明,这就是问题所在,您的 IDE 不知何故 "caching" 是该会话早些时候的函数定义。
一般来说,当您经常 运行 遇到毫无意义且一开始就不应该出现的怪异问题时(例如这个),您应该重新启动 IDE。通常情况下它可以解决问题,而问题只是像缓存这样的愚蠢问题。
此外,当使用 CPython、the default, most widely used implementation of the Python programming language 时,您正在使用 Python 作为一种解释型语言,因此您的解释器会按从上到下的顺序检查代码.这就是为什么通常不能在 Python.
中定义函数之前调用它的原因
在其他语言中我经常这样做:
someFunc()
someFunc() {
// This is my function
}
这样我就可以将所有函数堆叠在文件中较低的位置,但在顶部进行函数调用。现在我对正在发生的一切有了一个很好的了解。
但是,当我在 Spyder 中的 Python 3 中执行此操作时,我收到警告 Undefined name: 'myfunc'
my_func("Some string")
def my_func(some_var):
print(some_var)
代码运行良好,但我不确定这里的最佳实践是什么。我的方法有什么负面影响吗?或者它只是在调用函数之前拥有函数的指南?
我在上面设置的代码确实对我有用。这是为什么?我正在使用 Anaconda 运行ning Python 3.4.3。我的版本有什么不同?还是因为我 运行 它在 Spyder 中?
编辑:显然 Spyder 以神秘的方式工作。首先我在定义之后进行了调用,这有效,然后我将调用交换到第一行并且它仍然有效。 Spyder 似乎 缓存 函数或至少不会清除它们。 (虽然我不确定是 Spyder 在做缓存还是 Python 本身。我假设 Python。)对于任何想知道这个的新手:解决方案是重新启动你的程序 and/or Python 服务。
这在标准 Python 构建中不起作用,因为文件是按顺序解析的。你提到的其他语言都是编译的(传统意义上,不是 JIT 或任何东西),所以顺序无关紧要,但 Python 要求先到先得。
Define/assign/create/etc。使用它们之前的东西。
来自
Try restarting your interpreter, maybe you've accidentally defined
my_func
earlier on already?
和
The code, as is, doesn't work. You've most likely defined
my_func
earlier on already in the same REPL session, try restarting your IDLE or w/e you're using. The code doesn't work unless you've done something else already.
事实证明,这就是问题所在,您的 IDE 不知何故 "caching" 是该会话早些时候的函数定义。
一般来说,当您经常 运行 遇到毫无意义且一开始就不应该出现的怪异问题时(例如这个),您应该重新启动 IDE。通常情况下它可以解决问题,而问题只是像缓存这样的愚蠢问题。
此外,当使用 CPython、the default, most widely used implementation of the Python programming language 时,您正在使用 Python 作为一种解释型语言,因此您的解释器会按从上到下的顺序检查代码.这就是为什么通常不能在 Python.
中定义函数之前调用它的原因