调用后python中的声明函数

时间:2013-07-30 17:10:34

标签: 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

任何方式在开头都会出现另一个函数,就像包装器一样,必须在声明包装函数后调用此包装器,这不是退出。还有更多优雅真正的蟒蛇方式吗?

4 个答案:

答案 0 :(得分:4)

Python无法正常工作。 def按顺序执行,从上到下依次执行文件内容的其余部分。在将其定义为可调用(例如函数)之前,您无法调用某些内容,即使您有一个可调用的替代函数,也不会包含您要查找的代码。

当然,这并不意味着代码在执行开始之前没有编译 - 实际上,它是。但是,执行defdeclared_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中的实际现有对象。

但这不适用于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__":创建一个代码块,只有在程序是主程序时才会执行。
  4. 事实上,你应该在所有模块中做第三个。您可以在每个不希望作为主程序运行的文件的底部写下这个:

    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()