是的,我知道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'不兼容
我在做什么错了?
答案 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
批注,以指示不应重新分配它们。)