Pylint报not-callable错误但运行正常及传参为0时的调用疑问
Pylint误判cytoolz curry装饰函数的问题
复现代码
from cytoolz import curry @curry def get_generator(val): if val == 0: return for i in range(val): yield i gen = get_generator() for k in gen(2): print(k)
Pylint错误输出
test.py:13:9: E1102: gen is not callable (not-callable)
疑问
- 为何代码运行无异常,但Pylint标记
gen为不可调用对象? - 若将
gen(2)改为gen(0),代码仍可执行但无返回值,此时gen是否仍属于可调用对象?
解答
1. Pylint误判的原因
Pylint是静态代码分析工具,依赖预设规则和类型推断识别问题,但无法完全理解第三方库的动态行为。
cytoolz.curry的作用是将函数转为柯里化函数:当调用柯里化函数时,若传入参数数量不足,会返回一个新的可调用偏函数对象,等待接收剩余参数。但Pylint的静态分析无法追踪curry装饰器的这个动态逻辑,它仅根据原函数get_generator的代码推断返回类型——原函数可能返回生成器或None,因此错误认为get_generator()(无参数调用)返回的是不可调用对象,触发not-callable错误。
实际上gen是curry返回的偏函数,完全可以被调用,所以代码运行无异常。
2. gen(0)时gen是否仍可调用?
是的,gen本身始终是可调用对象。
gen是curry生成的偏函数实例,无论传入什么参数调用它,gen的可调用属性都不会改变。调用gen(0)时,会触发原函数get_generator(0)执行,此时原函数返回None,所以gen(0)的返回值是None,但gen本身依然可以被再次调用(比如gen(3)仍能生成正常的生成器)。
内容的提问来源于stack exchange,提问作者structuralengin
相关产品推荐
相关产品推荐

