我试图使用match
块来评估从typing.get_type_hints
返回的类型。我想使用类型提示来确定采用什么代码路径来实例化适当的值。
class Foo:
x: int = 0
y: float = 0.0
z: str = ''
name = 'x' # comes from an external source
value = '42'
type_hints = get_type_hints(Foo)
foo = Foo()
match type_hints[name]:
case int:
foo[name] = int(value)
case float:
foo[name] = int(value)
case str:
foo[name] = value
# TODO: other complex type parsing (e.g., Enums)
这是我得到的错误:
C:devbdk-gitbdkvenvScriptspython.exe C:/dev/bdk-git/bdk/material/reader.py
File "C:devbdk-gitbdkmaterialreader.py", line 22
case int:
^^^
SyntaxError: name capture 'int' makes remaining patterns unreachable
完成我想做的事情的正确语法是什么?
match/case
用于模式匹配,而不是简单的相等性检验。像int
这样的简单名称是一种匹配任何内容的模式,并将int
设置为值。
你应该使用普通的if
条件。
h = type_hints[name]
if h == int:
foo[name] = int(value)
elif h == float:
foo[name] = float(value)
elif h == str:
foo[name] = value
else:
print(f"Unknown type {h}")
我不确定你想用这里的类型提示做什么,但是为了在结构上匹配基于类,你需要提供一个变量,值将被分配,例如
foo = some_func()
match foo:
case int(value):
print(f"{value} is an integer")
case float(value):
print(f"{value} is a float")
检查foo
的类型是否已经是int
或float
(或其子类型),并将其绑定到value
,因此无需在匹配体中执行int(value)
。