【问题标题】:Pylance: "ClassVar" is not allowed in this context?Pylance:在这种情况下不允许使用“ClassVar”?
【发布时间】:2021-12-02 05:36:16
【问题描述】:

具有以下功能:

from typing import ClassVar 

def overrode_make_stub(cls: ClassVar["Emailer"]) -> bool:
    return not (getattr(cls.make_stub, "_not_overridden", False))

我在 Visual Studio Code 中从 Pylance 收到此错误:

在此上下文中不允许使用“ClassVar”

我正在使用 Python3.9 和 Pylance v2021.10.0。

在这个例子中,Email 类有一个“make_stub”函数,它的_not_overriden 属性设置为True。当我检查模块以查找该类的子类时,我可以使用它来过滤仅覆盖“make_sub”函数的模块。

我找不到有关此错误的任何文档。有谁知道为什么会出现?

【问题讨论】:

    标签: python type-hinting python-typing pylance


    【解决方案1】:

    ClassVar 类型提示旨在标记类级变量,以告诉类型系统它们确实是类变量,而不是实例变量的默认值。

    from typing import ClassVar
    
    class Example:
        x: int              # x and y are being type hinted as instance variables
        y: int
        z: ClassVar[int]    # z is being type hinted as a class variable instead
    

    如果你的函数的参数应该是一个类,那么you should use typing.Type 作为类型提示。试试这个,暗示你期望 Emailer 的子类:

    from typing import Type
    
    def overrode_make_stub(cls: Type["Emailer"]) -> bool:
        return not (getattr(cls.make_stub, "_not_overridden", False))
    

    请注意,如果您只需要兼容 Python 3.9 及更高版本,则实际上根本不需要使用typing.Type。您可以改用内置的type 对象,它可以以相同的方式被索引,这要感谢PEP 585:cls: type["Emailer"]

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-21
      • 1970-01-01
      相关资源
      最近更新 更多