Python能够将值与文字集或占位符进行匹配,如下所示:
choice = "apple"
match choice:
case "plum": ...
case "cherry": ...
case another_fruit:
print("Your selected fruit is:", another_fruit)
但是,如果我们有一个名为another_fruit
的变量,并且我们想与恰好匹配该变量的值,而不是分配一个同名的占位符,该怎么办?这有什么特殊的语法吗?
选项1
我不知道有什么句法上的解决办法。裸变量名通常被认为是占位符(或者更准确地说:"捕获模式"(。
然而,有一条规则是,限定的(即虚线(名称被视为引用,而不是捕获模式。如果您将变量another_fruit
存储在这样的对象中:
fruit_object = object()
fruit_object.another_fruit = "peach"
并这样引用它:
case fruit_object.another_fruit:
print("It's a peach!")
它会按照你想要的方式工作。
选项2
我最近还创建了一个名为match-ref
的库,它允许您通过点名称引用任何本地或全局变量:
from matchref import ref
another_fruit = "peach"
choice = "no_peach"
match choice:
case ref.another_fruit:
print("You've choosen a peach!")
它通过使用Python的inspect
模块来解析本地和全局名称空间(按此顺序(。
选项3
当然,如果你不介意失去一点便利,你不必安装第三方库:
class GetAttributeDict(dict):
def __getattr__(self, name):
return self[name]
def some_function():
another_fruit = "peach"
choice = "no_peach"
vars = GetAttributeDict(locals())
match choice:
case vars.another_fruit:
print("You've choosen a peach!")
GetAttributeDict
可以使用点属性访问语法访问字典,locals()
是一个内置函数,用于在本地命名空间中检索所有变量作为dict。