在 Python 中的文件末尾声明函数
Posted
技术标签:
【中文标题】在 Python 中的文件末尾声明函数【英文标题】:Declare function at end of file in Python 【发布时间】:2011-04-14 19:57:12 【问题描述】:是否可以在没有完全定义函数的情况下调用它?尝试此操作时出现错误:“function_name 未定义”。我来自 C++ 背景,所以这个问题难倒我。
在工作之前声明函数:
def Kerma():
return "energy / mass"
print Kerma()
但是,尝试在不先定义函数的情况下调用函数会带来麻烦:
print Kerma()
def Kerma():
return "energy / mass"
在 C++ 中,只要将函数头放在调用之前,就可以在调用之后声明函数。
我错过了什么吗?
【问题讨论】:
在 Python 中没有“声明”。有定义(必须是完整的)或者什么都没有。 你说,“它会带来麻烦”。你能详细说明一下吗? 我知道这已经很老了,但是为什么没有人建议将这些函数放在一个单独的.py
文件中并导入呢?会不会有一些意想不到的后果?
@Kyle Importing 只是在编译时将导入的代码粘贴到当前代码之前,所以和在调用它们之前定义当前代码中的函数是一样的 xD
python 中的一个巨大疏忽,它应该在执行之前读取文件,以便所有函数都可用,建议他们在 4x 中修复它
【参考方案1】:
在 Python 中一种惯用的方式是编写:
def main():
print Kerma()
def Kerma():
return "energy / mass"
if __name__ == '__main__':
main()
这允许您按照自己喜欢的顺序编写代码,只要您在最后继续调用函数main
。
【讨论】:
@Muhammad:虽然这是一种可行的方法,但它在 Python 中肯定不是惯用的。恰恰相反,您会注意到大多数main
函数通常放在最后。
@Eli Bendersky:我认为if __name__ == '__main__':
开关是常见的惯用部分。
@Eli:惯用的部分是最后的 if 子句:模块顶层没有代码,如果模块是 main.
@Eli:惯用的部分是if ... __main__':
。我没有说main
应该放在其余代码之上。我说过重要的部分是在最后调用_\_main__
,然后你把它的定义放在哪里都没有关系。
使用 if name == 'main': switch 它变得与你如何订购你的功能无关。这是正确的做法 (TM)。【参考方案2】:
当一个 Python 模块(.py 文件)运行时,其中的***语句按照它们出现的顺序执行,从上到下(从开始到结束)。这意味着在定义之前你不能引用它。例如以下将生成显示的错误:
c = a + b # -> NameError: name 'a' is not defined
a = 13
b = 17
与许多其他语言不同,def
和 class
语句在 Python 中是可执行的——不仅仅是声明性的——所以在发生这种情况并且它们被定义之前,你不能引用 a
或 b
。这就是为什么您的第一个示例遇到问题的原因 - 您在其 def
语句执行之前引用了 Kerma()
函数,并且主体已被处理并且生成的函数对象绑定到函数的名称,所以它没有在该点定义脚本。
C++ 等语言的程序通常在运行之前进行预处理,在此编译阶段,整个程序及其引用的任何#include
文件都会被一次性读取和处理。与 Python 不同,该语言具有声明性语句,允许在使用之前声明(但未定义)函数的名称和调用序列(或变量的静态类型),以便编译器遇到它们的名称时有足够的信息来检查它们用法,主要涉及类型检查和类型转换,这些都不需要定义它们的实际内容或代码体。
【讨论】:
并不是动态语言做不到。 Perl 是一种动态语言,您可以在定义函数之前调用它。那是因为它有一个编译阶段和一个执行阶段(虽然奇怪,但很有用,您可以安排在编译阶段执行代码)。这有效:doit(); sub doit print("I'm doing it!\n");
【参考方案3】:
这在 Python 中是不可能的,但坦率地说,您很快就会发现根本不需要它。编写代码的 Pythonic 方式是将程序划分为定义类和函数的模块,以及导入所有其他模块并运行的单个“主模块”。
对于简单的一次性脚本,习惯于将“可执行部分”放在末尾,或者更好的是,学习使用交互式 Python shell。
【讨论】:
【参考方案4】:如果您愿意像 C++ 一样使用函数中的所有内容。您可以从文件底部调用第一个函数,如下所示:
def main():
print("I'm in main")
#calling a although it is in the bottom
a()
def b():
print("I'm in b")
def a():
print("I'm in a")
b()
main()
这样python首先“读取”整个文件,然后开始执行
【讨论】:
【参考方案5】:Python 是一种动态编程语言,解释器总是获取变量(函数,...)在调用它们时的状态。您甚至可以重新定义某些 if 块中的函数,并每次都以不同的方式调用它们。这就是为什么你必须在调用它们之前定义它们。
【讨论】:
以上是关于在 Python 中的文件末尾声明函数的主要内容,如果未能解决你的问题,请参考以下文章