如何解决类型表达式描述枚举名称的字符串文字结合?
给出:
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
是否存在类型表达式Foo
如此:
Foo[Color] = Literal["RED","GREEN","BLUE"]
解决方法
摘自PEP 586-文字类型
Legal parameters for Literal at type check time
Literal [Color.RED]#假设颜色是一些枚举
也在PEP 586中:
Literals,enums,and forward references
amplify init
(...)在这种情况下,我们始终假定用户要构造文字字符串。Literal["Color.RED"]
(...)如果用户需要前向引用,则必须将整个文字类型包装在字符串中
"Literal[Color.RED]"
如果您想通过传递一个枚举成员的集合作为参数来声明from typing import Literal
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
FIRST = Literal["RED","GREEN","BLUE"]
SECOND = Literal[Color.RED,Color.GREEN]
THIRD = Literal["Color.RED","Color.GREEN"]
def one(arg: FIRST):
print("FIRST")
def two(arg: SECOND):
print("SECOND")
def three(arg: THIRD):
print("THIRD")
one("GREEN") # Linter issues no warning
one(Color.RED) # Expected type 'Literal["RED","BLUE"]',got 'Color' instead
one(Color.RED.name) # Expected type 'Literal["RED",got 'str' instead
two("RED") # Expected type 'Color',got 'str' instead
two(Color.RED) # Linter issues no warning
three("RED") # Expected type 'Literal["Color.RED","Color.GREEN"]',got 'Literal["RED"]' instead
three("Color.RED") # Linter issues no warning
three(Color.RED.name) # Expected type 'Literal["Color.RED",got 'str' instead
,我认为这是不可能的(请参阅:Illegal parameters for Literal at type check time),静态类型检查器会发出以下警告:>
'Literal'可以使用文字整数,字节和unicode字符串,布尔值,枚举值,无,其他文字类型或其他文字类型的别名来参数化
在这里不能使用加星号的表达方式
Literal
您将始终必须显式声明teste_one = ("RED","BLUE")
FIRST = Literal[teste_one]
FIRST = Literal[*teste_one]
test_two = Color.__members__.keys()
SECOND = Literal[test_two]
SECOND = Literal[*test_two]
的参数。
您可以使用Enum name编程访问来实现类似的效果:
class Colors(Enum):
RED = 1
GREEN = 2
BLUE = 3
ColorsNames = [color.name for color in Colors]
print(ColorsNames)
['RED','GREEN','BLUE']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。