PyCharm 无法识别没有冗余__init__的 SqlAlchemy 声明性子类签名



我有一个SqlAlchemy声明性基类,从中派生出更复杂的类,但我也需要";普通的";基类的实例。我知道SqlAlchemy默认情况下不会创建__init__方法,但基类确实有一个。尽管如此,PyCharm的linter似乎并没有像我所期望的那样摸索:它抱怨它不能识别子类实例初始化参数。

如果我正确地理解/使用了多态标识,那么当我查询基类表时,我会看到从与查询匹配的基类派生的任何内容。与其区分";普通的";通过检查类型或其他什么,我觉得应该把它们放在一个单独的简单派生类中,该类只引入一个新的类名、表名和多态标识名。

这就是解释为什么我对基类和";普通的";子类。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class GenericFoo(Base):
__tablename__ = 'generic_foo'
__mapper_args__ = {'polymorphic_identity': 'generic_foo'}
def __init__(self, name, color):
self.name = name
self.color = color
class SpecificFoo(GenericFoo):
__tablename__ = 'specific_foo'
__mapper_args__ = {'polymorphic_identity': 'specific_foo'}
# If I uncomment this the linter complaint goes away.
# def __init__(self, name, color):
#     super(SpecificFoo, self).__init__(name, color)
# PyCharm flags "Unexpected argument" on this statement.
foo = SpecificFoo(name='bob', color='blue')
# - - - - - - - - - - - - - - - - - - - - - - - -
# "Standard" definitions for comparison:
# - - - - - - - - - - - - - - - - - - - - - - - -
class GenericBar(object):
def __init__(self, name, color):
self.name = name
self.color = color
class SpecificBar(GenericBar):
pass
# This is of course fine.
bar = SpecificBar(name='bob', color='blue')

正如注释行中所指出的,如果我在SpecificFoo中省略了一个看似多余的__init__方法,PyCharm会为未识别的参数标记foo实例化。如果我在SpecificFoo中添加一个只调用super(SpecificFoo, self).__init__(name, color)__init__(self, name, color)方法,PyCharm会很高兴。

代码执行起来似乎没有错误,尽管我还没有尝试过任何可能会用到它的东西。我不喜欢仅仅为了让门楣高兴而增加一个多余的方法。但我担心PyCharm知道一些我不知道的事情,这里有一个错误会让我以后感到悲伤。你知道PyCharm为什么要标记这一点吗?如果真的有办法满足它(大概没有多余的__init__方法(吗?

如果您想毫不费力地解决问题,可以在最新版本的python上使用类型提示。

定义类时,只需将类型提示:db.Column直接放入声明中即可:

class GenericFoo(Base):
__tablename__ = 'generic_foo'
id: db.Column = db.Column(db.Integer, primary_key=True)
name: db.Column = db.Column(db.String, unique=True, nullable=False)

如果对所有表都这样做,结果确实有点冗长,但它也将对所有linter(不仅仅是PyCharm(完全起作用。

相关内容

  • 没有找到相关文章