$ 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 中实际存在的对象。
不过,这不适用于 def
或 class
语句。它们创建了一个 function
或 class
对象,但它们还没有执行其中的代码。因此,您有时间在它们的代码运行之前实例化它们内部的东西。
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
对象,变量名称 foo
和 bar
分别表示它们。您现在可以通过这些变量名称引用这些对象。
关于 Python 的典型解释方式(在 CPython 中),您应该确保您的模块中没有执行任何代码,除非它们作为主程序运行,或者除非您希望它们在导入时执行某些操作(一个罕见但有效的案例)。您应该执行以下操作:
- 将要执行的代码放入函数和类定义中。
- 除非代码只在主程序中执行才有意义,否则将其放在另一个模块中。
- 使用
if __name__ == "__main__":
创建一个代码块,只有当程序是主程序时才会执行。
事实上,您应该在所有模块中完成第三项。您可以简单地将其写在您不想作为主程序运行的每个文件的底部:
if __name__ = "__main__":
pass
这可以防止导入模块时发生任何事情。
关于python - 调用后python中的声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17953219/