python - 如果先前未定义变量,为什么匹配案例语句会分配给其中一种情况中使用的变量?
问题描述
在学习 Python 10 中引入的模式匹配时,我遇到了一个示例,其中一部分拆分字符串被分配/绑定到其中一种情况下使用的变量。
match 'make dir'.split():
case ["make"]:
print("default make")
case ["make", cmd]:
print(f"make command found: {cmd}"}
case ["restart"]:
print("restarting")
case ["rm", *files]:
print (f"deleting files: {files}")
case _:
print("didn't match")
第二种情况有先前未声明的变量cmd
,它最终被赋值"dir"
。
解决方案
在模式["make", cmd]
中,cmd
是一种捕获模式。捕获模式(看起来像不带点的名称,例如foo
、bar
或cmd
)匹配任何东西,并将匹配的值无条件地绑定到该名称。
在您的示例中,以 2 开头的任何长度序列"make"
都会将第二个元素绑定到cmd
并执行第二个case
块。这很有用,因为它允许您的应用程序轻松确定make
应该执行哪个命令。
cmd
无论是否已分配,都会发生这种情况。因此,如果它已经被绑定,那么旧值将被新的匹配值覆盖。
如果您想按值比较名称,则根据您的情况有几种选择:
如果名称带有点(如
args.cmd
或Class.VAR
),它将自动按相等比较(而不是捕获)。因此,您可以将["make", args.cmd]
其用作您的模式。如果名称是空的(如
cmd
orVAR
),您可以使用捕获模式和保护来通过相等性进行比较。使用这种技术,您的模式可能看起来像["make", c] if c == cmd
. 请注意,由于c
是一个捕获模式,它将像cmd
您原来的示例一样被反弹!(随着您更多地使用模式匹配,您会发现捕获模式 likec
在执行更复杂的模式匹配时非常有用。)
我建议任何想要熟悉 Python 的结构模式匹配的人查看官方教程。它以非常易于理解的方式涵盖了所有不同的模式(包括捕获模式)。
推荐阅读
- json - 如何将 XML 属性转换为 Perl 中的元素?
- sql - Keep a relation map in Objection.js while removing the table
- javascript - 选择条件渲染
- python - 如何将字典转换为熊猫数据框?
- graphql - Graphql 查询在控制台中记录一个数字
- javascript - 如何删除过滤器中的空数组
- gitlab - 如何使用 VirtualBox 执行器设置 Gitlab-runner
- java - 方法参考 - 语法错误,插入“;” 完成 BlockStatements
- python - 电子商务网站是否需要在 django 中使用单独的身份验证系统?
- xaml - 如何更改标签上标签的背景颜色。但背景将在弯角 Xamarin.Forms