在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
。
重新组织代码并始终将定义放在调用之前是唯一的解决方案吗?
发布于 2009-10-19 19:36:50
如果你不想在使用之前定义一个函数,并且在使用后定义它是不可能的,那么在其他模块中定义它会怎么样呢?
从技术上讲,你仍然首先定义它,但它是干净的。
您可以创建如下所示的递归:
def foo():
bar()
def bar():
foo()
Python的函数是匿名的,就像值是匿名的一样,但它们可以绑定到名称。
在上面的代码中,foo()
不调用名为foo的函数,它调用的函数恰好在调用时绑定到名称foo
。可以在其他地方重新定义foo
,然后bar
将调用新函数。
您的问题无法解决,因为这就像请求获取一个尚未声明的变量。
发布于 2009-10-19 19:36:33
您可以做的是将调用封装到它自己的函数中。
所以
foo()
def foo():
print "Hi!"
将会崩溃,但是
def bar():
foo()
def foo():
print "Hi!"
bar()
将会正常工作。
Python
中的一般规则不是函数应该在代码中定义得更高(就像在Pascal
中一样),而是应该在使用之前定义它。
希望这能有所帮助。
发布于 2009-10-19 19:33:54
如果您通过以下方式启动脚本:
if __name__=="__main__":
main()
那么你可能就不必担心“转发声明”之类的事情了。您看,解释器将加载您的所有函数,然后启动main()函数。当然,也要确保所有导入都是正确的;-)
想想看,我从来没有听说过python中的“转发声明”这样的东西……但话又说回来,我可能是错的;-)
https://stackoverflow.com/questions/1590608
复制相似问题