【问题标题】:Make function definition in a python file order independent使python文件中的函数定义独立于顺序
【发布时间】:2010-10-19 23:32:47
【问题描述】:

我使用 Python CGI。我不能在定义之前调用一个函数。

在 Oracle PL/SQL 中有一个“前向声明”的技巧:将所有函数命名在顶部,这样定义的顺序就无关紧要了。

Python中也有这样的技巧吗?

示例:

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


【解决方案1】:

使用多处理模块:

from multiprocessing import Process

p1 = Process(target=function_name, args=(arg1, arg2,))
p1.start()

【讨论】:

    【解决方案2】:

    对于所有人,尽管实践不佳,但仍希望找到解决方法...
    我有一个类似的问题并像这样解决它:

     import Configurations as this
     '''Configurations.py'''
     if __name__ == '__main__':
       this.conf01()
    
     '''Test conf'''
     def conf01():
       print ("working")
    

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

    【讨论】:

    • 很有趣 - 但必须使用 this 会破坏它的美感。
    【解决方案3】:

    更好地说明你的观点是:

    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() 的定义保留在顶部,以便于编辑——避免频繁滚动,如果大部分时间都花在编辑主目录上。

    【讨论】:

    • 这就是为什么用常见的if __name__ == "__main__": 屏障分隔声明和执行代码如此有意义的原因。
    • 我对用法感到困惑。如果我将它们设为main() 中的内部函数,则代码将失败。
    • @SimonZ。在main 中定义的函数只能在main 中看到,不能在全局范围内使用。
    【解决方案4】:
    def funB(d,c):
       return funA(d,c)
    
    print funB(2,3)
    
    def funA(x,y):
        return x+y
    

    以上代码将返回错误。但是,下面的代码很好......

     def funB(d,c):
         return funA(d,c)
    
     def funA(x,y):
         return x+y
    
     print funB(2,3)
    

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

    【讨论】:

      【解决方案5】:

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

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

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

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


      在您的示例中,print_something() 不合适。

      规则:必须在任何真正起作用的代码之前定义所有函数

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

      【讨论】:

      • 我认为函数声明的默认参数确实需要前向声明,例如def f(x=g()): .. def g(): .. 即使在声明时没有使用也不会编译。
      • @mnish True,这很好地说明了 默认参数是在编译时评估的,这通常不是预期的。请改用f(x=None): ...if x is None: x = g()
      【解决方案6】:

      我从来没有遇到过需要“前向函数定义”的情况。你能不能简单地将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 的解析器/执行器(?)是如何工作的

      【讨论】:

        【解决方案7】:

        假设您有一些代码 sn-p 在定义后调用您的函数 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 存在的时候是它到达第六步的时候。您应该能够验证 Python 在尝试查找 helper_function 以便调用它时引发错误之前一直执行到第 6 步。

        【讨论】:

        • 值得注意的是,变量也是如此(因为函数实际上只是一个恰好支持被调用的变量)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多