捕获使剩余的模式无法访问



为什么此代码失败:

OKAY = 200
NOT_FOUND = 404
INTERNAL_SERVER_ERROR = 500
match status:
case OKAY:
print('It worked')
case NOT_FOUND:
print('Unknown')
case INTERNAL_SERVER_ERROR:
print('Out of service')
case _:
print('Unknown code')

它生成以下错误消息:

File "/Users/development/Documents/handler.py", line 66
case OKAY:
^^^^
SyntaxError: name capture 'OKAY' makes remaining patterns unreachable

这个错误消息意味着什么?我如何修复代码使其正常工作?

问题原因

大小写子句中的变量名被视为名称捕获模式。

总是匹配并尝试对变量名进行赋值。几乎可以肯定的是,这不是我们想要的。

因为第一个匹配的case获胜,而且case OKAY总是匹配,所以永远不会检查其他case子句。

这解释了错误消息:

SyntaxError: name capture 'OKAY' makes remaining patterns unreachable

解决问题的关键

我们需要将名称捕获模式替换为非捕获模式,例如使用.运算符进行属性查找的值模式。点是匹配这一非捕获模式的关键。

实现这一点有很多方法。一种是将名称放在类名称空间中:

class ResponseCode:
OKAY = 200
NOT_FOUND = 404
INTERNAL_SERVER_ERROR = 500

现在,case ResponseCode.NOT_FOUND: ...是一个值模式(因为点(,不会捕获。

实现相同效果的另一种方法是将常数移动到它们自己的模块中,并使用点引用它们

import response_code
match status:
case response_code.OKAY: ...
case response_code.NOT_FOUND: ...
case response_code.INTERNAL_SERVER_ERROR: ...

除了创建一个类或模块外,还可以创建一个整数枚举以获得相同的效果:

from enum import IntEnum
class ResponseCode(IntEnum):
OKAY = 200
NOT_FOUND = 404
INTERNAL_SERVER_ERROR = 500

对于HTTP响应代码,已经在标准库中的HTTPStatus类中为您创建了一个整数枚举。

示例解决方案

这是原来问题的解决办法。用于枚举属性查找的.的存在是匹配情况将其识别为值模式的关键:

from http import HTTPStatus
status = 404
match status:
case HTTPStatus.OK:
print('It worked')
case HTTPStatus.NOT_FOUND:
print('Unknown')
case HTTPStatus.INTERNAL_SERVER_ERROR:
print('Out of service')
case _:
print('Unknown code')

在我的建议中,如果你正在使用一个问题,你必须像这样放置脚本。

match (your variable)
case Hello:
print('Hi back!')

至:

match (your variable)
case 'Hello':
print('Hi back!')

相关内容

  • 没有找到相关文章

最新更新