我对装饰类后的 Pylance 提示有疑问。我有一个无用的最小例子:
class PrimaryModel():
def print(self):
print("I am invisible O.o")
def mydeco(cls: PrimaryModel):
return cls
if __name__ == "__main__":
@mydeco
class User(PrimaryModel):
pass
alan = User()
alan.print() # no hints
问题是alan.print方法在IDE(VS Code)中似乎是未知的。 (代码工作正常) 现在我可以通过显式类型声明来修复它。这里,它暗示得很好:
class PrimaryModel():
def print(self):
print("I am invisible O.o")
def mydeco(cls: PrimaryModel):
return cls
if __name__ == "__main__":
@mydeco
class User(PrimaryModel):
pass
alan: PrimaryModel = User()
alan.print() # hints ok
但是,如果我对
User
进行子类化,则再次没有提示(取消注释装饰器会启用提示):
class PrimaryModel():
def print(self):
print("I am invisible O.o")
def mydeco(cls: PrimaryModel):
return cls
if __name__ == "__main__":
@mydeco
class User(PrimaryModel):
pass
class Player(User):
pass
alan: PrimaryModel = Player()
alan.print() # no hints :'(
问题出在哪里? Pylance 解决这个类型是否太复杂了?为什么即使我显式声明类型它也不提示?有办法解决吗?
我尝试了显式类型声明,检查运行时类型。只是没能成功。
您需要
mydeco
上的显式返回类型,并且应该从绑定类型变量构造。
class PrimaryModel():
def print(self):
print("I am invisible O.o")
def mydeco[T: PrimaryModel](cls: T) -> T:
return cls
if __name__ == "__main__":
@mydeco
class User(PrimaryModel):
pass
class Player(User):
pass
alan: PrimaryModel = Player()
以前,
User
的静态类型是Any
,它与PrimaryModel
兼容,但不携带有关该类的任何信息。通过正确键入
mydeco
,User
的静态类型仍保留为 User
本身。