Mypy 似乎无法理解属性不是类的可调用方法:
from abc import abstractmethod
from typing import Type
class A:
pass
class B:
@abstractmethod
@property
@classmethod
def other_type(cls) -> Type[A]:
pass
@classmethod
def __init_subclass__(cls, **kwargs):
assert issubclass(cls.other_type, A)
Run Code Online (Sandbox Code Playgroud)
在上面的示例上运行 mypy 会导致以下错误:
error: Argument 1 to "issubclass" has incompatible type "Callable[[], Type[A]]"; expected "type" [arg-type]
Run Code Online (Sandbox Code Playgroud)
如果没有 ,我如何强制执行正确的类型# type: ignore[arg-type]?我正在使用 mypy 版本 0.782 和 python 3.7
(注意:我正在使用该--check-untyped-defs标志运行 mypy,因此 mypy 应该扫描该__init_subclass__方法)。
我只是想尝试一下用于小型个人 Web 应用程序的 pony orm 映射器。除了为实体定义自定义构造函数之外,一切正常。
在下面的代码中,我创建了一个带有字符串字段的简单实体name,并定义了一个构造函数,该构造函数除了将参数重定向到父构造函数之外什么也不做(在我的真实应用程序中,我在将它们传递给父构造函数之前更改了一些参数)。之后我创建一个User并打印它的名称。
from pony.orm import Database, Required, db_session, commit
db = Database("sqlite", ":memory:", create_db=True)
class User(db.Entity):
def __init__(self, *args, **kwargs):
super(User, self).__init__(*args, **kwargs)
name = Required(str)
db.generate_mapping(create_tables=True)
with db_session:
u = User(name="Admin")
commit()
print(u, u.name)
Run Code Online (Sandbox Code Playgroud)
错误消息TypeError: object.__init__() takes no parameters与调用位于同一行super()。看起来关键字参数被发送到object而不是db.Entity. 当我删除构造函数时,一切正常
那么为什么它不起作用呢。难道像我的例子中的构造函数不应该总是工作(当然什么也不做)吗?ponyorm 中是否有某些东西阻止它工作,或者我在这里遗漏了一些东西?
为了完整起见,我的实体定义实际上是这样的
class User(db.Entity):
def __init__(self, *args, **kwargs):
if "password" not in kwargs:
raise ValueError("password is required")
kwargs["password"] = werkzeug.security.generate_password_hash(kwargs["password"])
super().__init__(*args, …Run Code Online (Sandbox Code Playgroud)