You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

疑问

  1. 为何代码运行无异常,但Pylint标记gen为不可调用对象?
  2. 若将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:04:54