$ 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
任何方式在开头都会出现另一个函数,就像包装器一样,必须在声明包装函数后调用此包装器,这不是退出。还有更多优雅真正的蟒蛇方式吗?
答案 0 :(得分:4)
Python无法正常工作。 def
按顺序执行,从上到下依次执行文件内容的其余部分。在将其定义为可调用(例如函数)之前,您无法调用某些内容,即使您有一个可调用的替代函数,也不会包含您要查找的代码。
当然,这并不意味着代码在执行开始之前没有编译 - 实际上,它是。但是,执行def
时declared_after
实际上已在def
块中分配了代码,而不是之前。
你拉出来实现所需效果的任何技巧必须具有延迟调用declared_after()
直到定义之后的效果,例如,将其封闭在另一个def
块中本身后来被称为。
答案 1 :(得分:3)
您无法在Python中转发声明函数。这样做没有多大意义,因为Python是动态类型的。你可以做一些像这样愚蠢的事情,以及期望它做什么?
foo = 3
foo()
def foo():
print "bar"
显然,你正试图__call__
int
对象为3.这绝对是愚蠢的。
你问你是否可以在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
这样可以防止在导入模块时发生任何事情。
答案 2 :(得分:2)
您可以做的一件事是将所有内容包含在主函数中:
def main():
declared_after()
def declared_after():
print("good declared after")
main()
然而,重点仍然是必须在调用之前定义函数。这仅适用,因为main
在定义declared_after
后被调用。
答案 3 :(得分:0)
正如zigg所写的那样,Python文件是按照从上到下的顺序执行的,所以即使你之前可以“声明”变量,实际的函数体也只能在调用函数后到达。
解决这个问题的通常方法是只使用main
函数来执行所有标准执行操作:
def main ():
# do stuff
declared_after();
def declared_after():
pass
main()
然后,您还可以将其与__name__ == '__main__'
idiom结合使用,使该功能仅在您直接执行模块时执行:
def main ():
# do stuff
declared_after();
def declared_after():
pass
if __name__ == '__main__':
main()