Python类变量调用函数报错:TypeError: 期望1个参数却传入2个
问题解析:TypeError报错原因及解决方法
问题场景
定义的类代码如下:
class Exchange(exchanges.L3Exchange): extract_mmt_fields = aquis_extract_mmt_fields def write_data(self): ... update_message = self.extract_mmt_fields(mmt_flag_values)
导入的外部函数定义:
def aquis_extract_mmt_fields(mmt_flag_values): ...
调用时触发报错:
TypeError: aquis_extract_mmt_fields() takes 1 positional argument but 2 were given
明明只传入一个参数,却出现参数数量不匹配的错误,原因如下:
原因分析
当你把普通函数aquis_extract_mmt_fields赋值为类变量后,通过self.extract_mmt_fields()调用时,Python会自动将当前实例self作为第一个参数传入该函数,相当于实际执行的是aquis_extract_mmt_fields(self, mmt_flag_values)。但原函数仅定义了一个参数,因此触发TypeError。
本质是Python会把实例调用的类中普通函数当作实例方法处理,自动传入实例本身作为第一个参数。
解决方法
有三种可行的解决方式:
- 方式一:将函数转为静态方法
用staticmethod包装函数,告诉Python不需要自动传入self:from functools import staticmethod class Exchange(exchanges.L3Exchange): extract_mmt_fields = staticmethod(aquis_extract_mmt_fields) def write_data(self): ... update_message = self.extract_mmt_fields(mmt_flag_values) - 方式二:直接调用原函数
如果不需要通过类/实例传递上下文,跳过类变量直接调用导入的函数:class Exchange(exchanges.L3Exchange): def write_data(self): ... update_message = aquis_extract_mmt_fields(mmt_flag_values) - 方式三:通过类调用类变量
不通过实例self调用,而是直接用类名调用类变量,避免自动传入self:class Exchange(exchanges.L3Exchange): extract_mmt_fields = aquis_extract_mmt_fields def write_data(self): ... update_message = Exchange.extract_mmt_fields(mmt_flag_values)
内容的提问来源于stack exchange,提问作者user21641220
相关产品推荐
相关产品推荐

