是否有可能在Python中前向声明一个函数?我想在声明之前使用我自己的cmp函数对列表进行排序。

print "\n".join([str(bla) for bla in sorted(mylist, cmp = cmp_configs)])

我把cmp_configs方法的定义放在调用之后。它会失败,报错如下:

NameError: name 'cmp_configs' is not defined

是否有任何方法在使用cmp_configs方法之前“声明”它?

有时候,很难重新组织代码来避免这个问题。例如,在实现某些形式的递归时:

def spam():
    if end_condition():
        return end_result()
    else:
        return eggs()

def eggs():
    if end_condition():
        return end_result()
    else:
        return spam()

其中end_condition和end_result已经在前面定义。

唯一的解决方案是重新组织代码并始终在调用之前放置定义吗?


当前回答

# declare a fake function (prototype) with no body
def foo(): pass

def bar():
    # use the prototype however you see fit
    print(foo(), "world!")

# define the actual function (overwriting the prototype)
def foo():
    return "Hello,"

bar()

输出:

Hello, world!

其他回答

Python不支持前向声明,但常见的解决方法是在脚本/代码的末尾使用以下条件:

if __name__ == '__main__': main()

这样,它将首先读取整个文件,然后计算condition并调用main()函数,该函数将能够调用任何前向声明的函数,因为它已经首先读取了整个文件。此条件利用特殊变量__name__,当我们从当前文件运行Python代码时,该变量返回__main__值(当代码作为模块导入时,__name__返回模块名)。

“重新组织我的代码,这样我就不会有这个问题了。”正确的。很容易做到。总是工作。

您总是可以在引用函数之前提供该函数。

“然而,在某些情况下,这可能是不可避免的,例如在实现某些形式的递归时”

我看不出这有什么可能。请举例说明在使用之前不能定义函数的地方。

如果你通过以下方式启动你的脚本:

if __name__=="__main__":
   main()

那么你可能就不必担心“向前声明”之类的事情了。你看,解释器会加载你所有的函数,然后启动你的main()函数。当然,也要确保所有的导入都是正确的;-)

仔细想想,我从来没有在python中听到过“前向声明”这样的东西……但话说回来,我可能错了;-)

在Python中不能前向声明函数。如果在定义函数之前已经执行了逻辑,那么无论如何都可能遇到问题。将你的动作放在脚本末尾的if __name__ == '__main__'中(通过执行一个你命名为“main”的函数,如果它不是平凡的),你的代码将更加模块化,如果你需要,你将能够将它作为一个模块使用。

同样,用生成器表达式替换该列表理解(即,打印"\n".join(str(bla) for bla in sorted(mylist, cmp=cmp_configs)))

另外,不要使用已弃用的cmp。使用键并提供小于函数。

有时,算法最容易自上而下地理解,从整体结构开始,深入到细节。

你可以在没有前向声明的情况下这样做:

def main():
  make_omelet()
  eat()

def make_omelet():
  break_eggs()
  whisk()
  fry()

def break_eggs():
  for egg in carton:
    break(egg)

# ...

main()