在 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

与许多其他语言不同,defclass 语句在 Python 中是可执行的——不仅仅是声明性的——所以在发生这种情况并且它们被定义之前,你不能引用 ab。这就是为什么您的第一个示例遇到问题的原因 - 您在其 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 中的文件末尾声明函数的主要内容,如果未能解决你的问题,请参考以下文章

python中的文件操作

Python中的seek函数 指针 使用教程

python里的end是啥意思

水文日常~~Python如何按行读取txt文件中的数据并去除每行末尾的回车符

Python中的异常处理

水文日常~~Python如何按行读取txt文件中的数据并去除每行末尾的回车符