代码之家  ›  专栏  ›  技术社区  ›  zerohedge

python:如何输入提示类变量?

  •  0
  • zerohedge  · 技术社区  · 5 年前

    是的,我知道 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\u name” “str”与“someClass”不兼容

    我做错什么了?

    1 回复  |  直到 5 年前
        1
  •  1
  •   user2357112    5 年前

    一种暗示 SomeClass 意味着值应该是 某个阶级 ,不是类变量 某个阶级 “。”什么之中的一个 某个阶级 's class variables“不是一个类型,并且没有可用于该含义的注释。

    这种情况的stdlib解决方案是 enum.Enum ,但你拒绝了。在这种情况下,接下来最好的事情是 typing.Literal 类型,在Python3.8中引入。有了它,你可以写

    SomeClassValue = typing.Literal['regular', 'important', 'accounts', 'special']
    
    def do_something(*, queue_name: SomeClassValue):
        ...
    

    不能 以某种方式从 某个阶级 ;它可能会运行,但不会键入check。这意味着如果你走这条路,你将不得不有很多容易出错的代码重复。(另外,您可能需要 Literal 类变量上的注释-我不知道将为这些变量推断什么类型。)