计算类型化对象的Python匹配语法



我试图使用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的类型是否已经是intfloat(或其子类型),并将其绑定到value,因此无需在匹配体中执行int(value)

最新更新