Python Flask教程中,super(User, self).__init__(**kwargs) 为什么被IDE提示unexpected argument错误?

用 Pycharm 看的这个代码,super(User, self).__init__(**kwargs) 中的 ···**kwargs``` 部分一直被 Pycharm 提示:unexpected argument

#models.py

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
... ...

def __init__(self, **kwargs):
    super(User, self).__init__(**kwargs)  # 这里 IDE 提示 **kwargs:unexpected argument
    ... ...
    self.followed.append(Follow(followed=self))


Python Flask教程中,super(User, self).__init__(**kwargs) 为什么被IDE提示unexpected argument错误?

8 回复

因为你忘了传 self


这个错误通常是因为你的 User 类没有正确继承 Flask-LoginUserMixin 类,或者父类的 __init__ 方法不接受 **kwargs 参数。

Flask-Login 的 UserMixin 类本身没有 __init__ 方法,它只提供了一些默认的认证方法。当你调用 super().__init__(**kwargs) 时,实际上是在调用 object.__init__(),而 object.__init__() 不接受任何参数。

正确的做法是:

  1. 如果你的 User 类需要初始化属性,应该在自己的 __init__ 方法中处理:
from flask_login import UserMixin
from your_database_module import db

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    
    def __init__(self, username, email, **kwargs):
        self.username = username
        self.email = email
        # 处理其他可能的参数
        for key, value in kwargs.items():
            setattr(self, key, value)
  1. 如果使用 SQLAlchemy 等 ORM,通常不需要自定义 __init__ 方法,因为 ORM 会处理:
from flask_login import UserMixin
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
    
    # 不需要写 __init__ 方法,SQLAlchemy 会自动处理
  1. 如果确实需要调用父类初始化,确保父类接受这些参数:
class User(UserMixin, SomeOtherClass):
    def __init__(self, **kwargs):
        # 先调用 SomeOtherClass 的 __init__
        super().__init__(**kwargs)  # 假设 SomeOtherClass 接受 **kwargs
        # 然后设置自己的属性
        self.custom_attribute = kwargs.get('custom_attribute')

总结: 检查你的继承结构,确保调用的父类 __init__ 方法确实接受你传递的参数。

不妨看一下语法 ** 是什么意思?




感觉这个像是 Pycharm 的 bug,对 super()继承父类的参数识别不准确吧。有了解的同学,请指正。

**kwargs->kwargs

好像没有用 hhh

看一下你的 UserMixin 和 db.Model 的 init 方法怎么定义的,下面这种写法肯定会报错啊
class UserMixin():
def init(self):
pass


class User(UserMixin):
tablename = ‘users’

def init(self, **kwargs):
super(User, self).init(**kwargs)

老铁没毛病啊,这个应该是你 pycharm 的问题

回到顶部