在Python文件中使函数定义与顺序无关[重复]

问题描述 投票:0回答:7

我使用Python CGI。 在定义函数之前我无法调用它。

在 Oracle PL/SQL 中,有一个“前向声明”的技巧:将所有函数命名在顶部,因此定义的顺序并不重要。

Python也有这样的trick吗?

示例:

def do_something(ds_parameter):
    helper_function(ds_parameter)
    ....

def helper_function(hf_parameter):
    ....

def main():
    do_something(my_value)

main()

大卫是对的,我的例子是错误的。 怎么样:

<start of cgi-script>

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 

print_something() 

def helper_function(hf_parameter): 
    .... 

def main()
    ....

main()

我可以在脚本顶部“转发声明”函数吗?

python
7个回答
97
投票

所有函数必须在使用之前定义。

但是,可以按任何顺序定义函数,只要在任何可执行代码使用函数之前定义所有函数即可。

您不需要“前向声明”,因为所有声明都是完全独立的。 只要所有声明都位于所有可执行代码之前。

你有问题吗? 如果是这样,请发布不起作用的代码。


在您的示例中,

print_something()
不合适。

规则:所有函数必须在任何实际工作的代码之前定义

因此,将所有有效的语句放在最后


48
投票

更好地说明你的观点是:

def main():
    print_something() 
    ....

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 


main()

换句话说,您可以将

main()
的定义保留在顶部,以方便编辑 - 如果大部分时间都花在编辑 main 上,则可以避免频繁滚动。


5
投票

假设您有一些代码片段在定义后调用您的函数 main,那么您的示例将按编写的方式工作。 由于 Python 的解释方式,在定义 do_something 函数时,不需要定义由

do_something
主体调用的任何函数。

Python 在执行代码时将采取的步骤如下。

  1. 定义函数 do_something。
  2. 定义函数helper_function。
  3. 定义函数 main。
  4. (根据我上面的假设)调用 main。
  5. 从 main 调用 do_something。
  6. do_something
    ,调用helper_function。

Python 唯一关心

helper_function
存在的时候是当它到达第六步时。 在尝试查找 helper_function 以便调用它时引发错误之前,您应该能够验证 Python 是否已完成第六步。


3
投票

我从来没有遇到过需要“前向函数定义”的情况..你能不能简单地将

print_something()
移动到你的主函数内部..?

def do_something(ds_parameter):
    helper_function(ds_parameter) 
    .... 

def print_something(): 
    do_something(my_value) 


def helper_function(hf_parameter): 
    .... 

def main()
    print_something() 
    ....

main()

Python 不关心 helper_function() 是在第 3 行使用后定义的(在

do_something
函数中)

我建议使用 WinPDB 之类的东西并逐步执行代码。它很好地展示了 Python 的解析器/执行器(?)是如何工作的


2
投票
def funB(d,c):
   return funA(d,c)

print funB(2,3)

def funA(x,y):
    return x+y

上面的代码将返回Error。但是,下面的代码没问题......

 def funB(d,c):
     return funA(d,c)

 def funA(x,y):
     return x+y

 print funB(2,3)

因此,即使您必须在完成任何实际工作之前明确定义该函数,但如果您不显式使用该函数,则有可能逃脱。我认为这有点类似于其他语言的原型设计......


2
投票

我遇到了类似的问题并这样解决:

 import Configurations as this
 '''Configurations.py'''
 if __name__ == '__main__':
   this.conf01()

 '''Test conf'''
 def conf01():
   print ("working")

所以我可以在文件顶部更改我的目标配置。诀窍是将文件导入到其自身中。


-1
投票

使用多处理模块:

from multiprocessing import Process

p1 = Process(target=function_name, args=(arg1, arg2,))
p1.start()
© www.soinside.com 2019 - 2024. All rights reserved.