装饰类后没有 Pylance 提示(Python)

问题描述 投票:0回答:1

我对装饰类后的 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 解决这个类型是否太复杂了?为什么即使我显式声明类型它也不提示?有办法解决吗?

我尝试了显式类型声明,检查运行时类型。只是没能成功。

python class decorator pylance class-decorator
1个回答
0
投票

您需要

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
本身。

© www.soinside.com 2019 - 2024. All rights reserved.