Python代码报错:__init__()仅接受1个位置参数但传入了2个
问题排查:TypeError: init() takes 1 positional argument but 2 were given
问题场景
抛出异常的代码片段:
def post(self, tagname): parser = reqparse.RequestParser() parser.add_argument('active', type=int, required=False, help="active required") parser.add_argument('desc', type=str, required=True, help="desc required") parser.add_argument('product', type=str, required=False, help="product optional") data = parser.parse_args() if t is None: #Tag exists - cannot create new Tag print(f"User does not exist - creating a new Tag") t = Tag(data).insert() return t.json(), 201
Tag类构造函数定义:
class Tag(sql_al_db.Model): __tablename__ = 'tags' id = sql_al_db.Column(sql_al_db.Integer, primary_key=True) tagname = sql_al_db.Column(sql_al_db.String(80)) active = sql_al_db.Column(sql_al_db.Integer) desc = sql_al_db.Column(sql_al_db.String(120)) product = sql_al_db.Column(sql_al_db.String(120)) def __init__(self, **kwargs): super(Tag, self).__init__(**kwargs) for key in ('tagname', 'active', 'desc', 'product'): if key in kwargs: setattr(self, key, kwargs[key]) print("Set kwargs like so after initiating object") pprint(kwargs)
异常堆栈信息:
line 72, in post t = Tag(data).insert() TypeError: __init__() takes 1 positional argument but 2 were given
问题原因
Tag类的__init__方法仅接受关键字参数(**kwargs),但调用Tag(data)时,你将data作为位置参数传入——相当于给__init__传了两个参数:默认的self,以及data,这与方法定义的参数规则冲突,因此触发错误。
另外,post方法接收的tagname参数未被传入Tag实例,会导致Tag对象的tagname字段为空,不符合业务逻辑。
解决方案
- 将位置参数改为关键字参数传递,使用
**解包data字典:
# 先把tagname加入data字典 data['tagname'] = tagname # 解包字典为关键字参数传入 t = Tag(**data).insert()
- 简化Tag类(可选):SQLAlchemy的
Model父类已经实现了关键字参数赋值逻辑,自定义的__init__方法可以完全移除,直接使用父类逻辑即可:
class Tag(sql_al_db.Model): __tablename__ = 'tags' id = sql_al_db.Column(sql_al_db.Integer, primary_key=True) tagname = sql_al_db.Column(sql_al_db.String(80)) active = sql_al_db.Column(sql_al_db.Integer) desc = sql_al_db.Column(sql_al_db.String(120)) product = sql_al_db.Column(sql_al_db.String(120)) # 无需自定义__init__方法
内容的提问来源于stack exchange,提问作者banditKing
相关产品推荐
相关产品推荐

