Python:如何类型提示类变量?

时间:2019-10-26 01:18:45

标签: python

是的,我知道Enum类,但对使用它不感兴趣。

这是我的班级枚举:

class SomeClass:
    SOME_STRING = "regular"
    SOME_STRING2 = "important"
    SOME_STRING3 = "accounts"
    SOME_STRING4 = "special"

这是我的类型提示函数:

def do_something(*, queue_name: SomeClass):
    #....

当我这样称呼它时:

purge_queue(queue_name=SomeClass.SOME_STRING)

我收到警告:

  

不能将类型'Literal ['regular']'的参数分配给类型'SomeClass'的参数'queue_name'     'str'与'SomeClass'不兼容

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

类型提示SomeClass意味着值应该是SomeClass的实例,而不是SomeClass的类变量。 “ SomeClass的类变量之一”不是类型,并且没有可用于此含义的注释。

用于这种情况的stdlib解决方案是enum.Enum,但是您已经拒绝了。在这种情况下,下一个最好的方法是Python 3.8中引入的typing.Literal类型。这样,您可以编写类似

的内容
SomeClassValue = typing.Literal['regular', 'important', 'accounts', 'special']

def do_something(*, queue_name: SomeClassValue):
    ...

无法以某种方式从SomeClass的类变量中提取类型参数;它可能会运行,但不会进行类型检查。这意味着如果沿着这条路线走,将必须有很多容易出错的代码重复。 (此外,您可能需要在类变量上放置Final批注,以指示不应重新分配它们。)