首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中可以向前声明一个函数吗?

在Python中可以向前声明一个函数吗?
EN

Stack Overflow用户
提问于 2009-10-20 03:29:22
回答 16查看 203.3K关注 0票数 223

在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_conditionend_result

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

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-10-19 19:36:50

如果你不想在使用之前定义一个函数,并且在使用后定义它是不可能的,那么在其他模块中定义它会怎么样呢?

从技术上讲,你仍然首先定义它,但它是干净的。

您可以创建如下所示的递归:

def foo():
    bar()

def bar():
    foo()

Python的函数是匿名的,就像值是匿名的一样,但它们可以绑定到名称。

在上面的代码中,foo()不调用名为foo的函数,它调用的函数恰好在调用时绑定到名称foo。可以在其他地方重新定义foo,然后bar将调用新函数。

您的问题无法解决,因为这就像请求获取一个尚未声明的变量。

票数 85
EN

Stack Overflow用户

发布于 2009-10-19 19:36:33

您可以做的是将调用封装到它自己的函数中。

所以

foo()

def foo():
    print "Hi!"

将会崩溃,但是

def bar():
    foo()

def foo():
    print "Hi!"

bar()

将会正常工作。

Python中的一般规则不是函数应该在代码中定义得更高(就像在Pascal中一样),而是应该在使用之前定义它。

希望这能有所帮助。

票数 164
EN

Stack Overflow用户

发布于 2009-10-19 19:33:54

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

if __name__=="__main__":
   main()

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

想想看,我从来没有听说过python中的“转发声明”这样的东西……但话又说回来,我可能是错的;-)

票数 105
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1590608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档