python - 调用后python中的声明函数

标签 python

$ cat  declare_funcs.py
#!/usr/bin/python3

def declared_after():
        print("good declared after")

declared_after()

$ python3 declare_funcs.py
good declared after

更改通话地点:

$ cat  declare_funcs.py
#!/usr/bin/python3

declared_after()

def declared_after():
        print("good declared after")

$ python3 declare_funcs.py
Traceback (most recent call last):
  File "declare_funcs.py", line 4, in <module>
    declared_after()
NameError: name 'declared_after' is not defined

有没有办法像在 C/C++ 中一样只声明函数头?

例如:

#!/usr/bin/python3

def declared_after() # declaration about defined function 

declared_after()

def declared_after():
        print("good declared after")

我找到了这个 Declare function at end of file in Python

任何方式都在开头出现另一个函数,如包装器,并且必须在声明包装函数后调用此包装器,这不是退出。有没有更优雅的真正python方式?

最佳答案

您不能在 Python 中前向声明函数。这样做意义不大,因为 Python 是动态类型的。您可以像这样做一些愚蠢的事情,它会做什么?

foo = 3
foo()
def foo():
    print "bar"

显然,您正在尝试为 3 __call__ int 对象。这绝对是愚蠢的。

您询问是否可以像在 C/C++ 中那样进行前向声明。好吧,您通常不会通过解释器运行 C。然而,虽然 Python 是 compiled to bytecode , python3 程序是一个解释器。

编译语言中的前向声明是有意义的,因为您只是建立一个符号及其类型,编译器可以多次运行代码来理解它。然而,当您使用解释器时,您通常无法拥有这种奢侈,因为您必须遍历其余代码以找到该前向声明的含义,并在完成后再次遍历它。

当然,你可以这样做:

foo = lambda: None
foo()
def foo():
    print "bar"

但是您仍然实例化了 foo。一切都必须指向 Python 中实际存在的对象。

不过,这不适用于 defclass 语句。它们创建了一个 functionclass 对象,但它们还没有执行其中的代码。因此,您有时间在它们的代码运行之前实例化它们内部的东西。

def foo():
    print bar()
# calling foo() won't work yet because you haven't defined bar()
def bar():
    return "bar"
# now it will work

不同之处在于,您只是简单地创建了 function 对象,变量名称 foobar 分别表示它们。您现在可以通过这些变量名称引用这些对象。

关于 Python 的典型解释方式(在 CPython 中),您应该确保您的模块中没有执行任何代码,除非它们作为主程序运行,或者除非您希望它们在导入时执行某些操作(一个罕见但有效的案例)。您应该执行以下操作:

  1. 将要执行的代码放入函数和类定义中。
  2. 除非代码只在主程序中执行才有意义,否则将其放在另一个模块中。
  3. 使用 if __name__ == "__main__": 创建一个代码块,只有当程序是主程序时才会执行。

事实上,您应该在所有模块中完成第三项。您可以简单地将其写在您不想作为主程序运行的每个文件的底部:

if __name__ = "__main__":
    pass

这可以防止导入模块时发生任何事情。

关于python - 调用后python中的声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17953219/

相关文章:

python - 如何从单独的类配置Tkinter小部件?

python - Tensorflow 不开始训练

python - 在 bluemix 上运行我的应用程序时出现错误 Can't open lib 'SQL Server'

Django 循环的 Pythonic 方法

python - 什么是 __del__ 方法,我该如何调用它?

python - 多处理还是多线程?

python - 当完全限定对象类与限定类不同时,isinstance() 返回 false

python - 两个常量字符串之间的正则表达式匹配文本

python - win32gui:如何获取窗口的状态栏文本?

python - 在 iPython/Jupyter 笔记本中安装多个 Python 3 内核