如何前向声明函数以避免稍后定义的函数出现 NameError?

新手上路,请多包涵

是否可以在 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 之前已定义。

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

原文由 Nathan Fellman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 436
2 个回答

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

从技术上讲,您仍然首先定义它,但它很干净。

您可以创建如下递归:

 def foo():
    bar()

def bar():
    foo()

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

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

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

原文由 RichN 发布,翻译遵循 CC BY-SA 3.0 许可协议

将调用包装到它自己的函数中,以便

foo()

def foo():
    print "Hi!"

会破裂,但是

def bar():
    foo()

def foo():
    print "Hi!"

bar()

将正常工作。

Python 中的一般规则是函数应该在使用之前定义,这 并不 一定意味着它需要在代码中更高。

原文由 Vanya 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题