为什么方法调用的语句是 uncallable 的?

2019-03-30 18:07:56 +08:00
 Wolfsin

类如

func():
    pass

callable(func) -->true
callable(func()) -->false

不知道应该怎么理解,另外 callable(lambda: func()) -->true 这又是为什么?

P.S. 问这个问题的原因:

写 pyqt 信号槽的时候,PushButton.clicked.connect(self.func)这个语句后面的 func 如果需要传值,则要改成PushButton.clicked.connect(lambda: self.func(a)) 看 stack overflow 解释说是 clicked.connect()里需要一个 callable 的参数。 stack overflow 原文: https://stackoverflow.com/questions/45793966/clicked-connect-error

1042 次点击
所在节点    问与答
7 条回复
NeilWang
2019-03-30 18:13:19 +08:00
callable(func())已经对 func 进行调用了,实际判断的是 func 返回值是否 callable
guiqiqi
2019-03-30 18:13:19 +08:00
func()默认返回值是 None,怎么可能 callable 啊,大锅。
Wolfsin
2019-03-30 18:19:34 +08:00
@NeilWang #1
@guiqiqi #2
啊,对哦,原来是在对 func 的返回值进行判断,懂了,之前钻进牛角尖了。那另外问一下 lambda: func()的返回值是什么啊,为什么就可以 callable ?
huaouo
2019-03-30 18:20:58 +08:00
@Wolfsin 返回 func() ?
Wolfsin
2019-03-30 18:28:44 +08:00
@huaouo #4 如果返回 func(),那不就等于 callable(func())了,如果说返回的是 func,那如果 func 带有参数呢?类如 func(a)这个方法
callable(func) -->true
callable(func(a)) -->false
callable(lambda:func(a)) -->true
guiqiqi
2019-03-30 18:30:37 +08:00
@Wolfsin 大锅,lambda 返回匿名函数啊,当然是 callable,如果调用了 lambda 表达式,就不一定了
Wolfsin
2019-03-30 18:45:09 +08:00
@guiqiqi #6 明白了,又去翻了文档
https://docs.python.org/zh-cn/3.7/reference/expressions.html#lambda
def <lambda>(parameters):
return expression
lambda 实际上是产生了一个这样的函数里面绑定了参数,理解了,谢谢解释

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550312

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX