Matplotlib FuncAnimation报需0位置参数却传入1个错误如何解决
报错根因
两个报错本质都是不熟悉FuncAnimation的回调规则导致的:
- 第一个
TypeError: findPrice() takes 0 positional arguments but 1 was given:FuncAnimation每次触发帧更新时,会自动将**当前帧的序号(从0开始递增的整数)**作为第一个位置参数传入回调函数,无论回调是否需要使用这个值,传参动作都会执行。你定义的findPrice是无参函数,无法接收这个自动传入的参数,就会触发参数数量不匹配的错误。 - 第二个
TypeError: 'NoneType' object is not callable:FuncAnimation构造函数的第二个入参要求传入可调用的函数对象。你把findPrice改成findPrice()后,代码会在初始化动画时立刻执行一次findPrice函数,把函数返回值(未写return语句的函数默认返回None)传给FuncAnimation。后续动画帧触发时,FuncAnimation会尝试调用这个传入值,发现是None不具备调用能力,就会触发该报错。
修复方案
根据代码习惯二选一即可:
- 方案1:给回调函数添加占位形参
直接修改findPrice的函数定义,增加一个位置形参用于接收自动传入的帧序号即可,函数内部不需要使用该参数的话可以完全忽略它。
不需要用到帧序号时,推荐用下划线作为形参名,标识这是个未使用的占位参数:
初始化动画的代码保持原写法即可,不要给函数名加括号:def findPrice(_): # 此处保留你原来的全部业务逻辑,不需要改动 # 比如价格计算、图表更新的代码都放在这里 passani = FuncAnimation(plt.gcf(), findPrice, interval=1000) - 方案2:用lambda做适配层(不修改原函数时使用)
如果你不想改动已经写好的无参findPrice函数,可以在传参时包裹一层lambda表达式,接住自动传入的帧参数后再调用你的原函数:ani = FuncAnimation(plt.gcf(), lambda _: findPrice(), interval=1000)
额外提醒:FuncAnimation生成的动画对象必须赋值给一个生命周期足够长的变量(比如全局变量、类实例属性),不要直接写无赋值的
FuncAnimation(...)调用,否则动画对象会被Python垃圾回收机制回收,出现动画不显示、运行卡住的问题。
内容的提问来源于stack exchange,提问作者Alex Rowe
相关产品推荐
相关产品推荐

