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

2024-04-19 07:05:27 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么此代码会失败:

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

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


Tags: 代码消息servermatchstatus错误notit
1条回答
网友
1楼 · 发布于 2024-04-19 07:05:27

问题的原因

case子句中的变量名被视为name capture pattern

它总是匹配并尝试为变量名赋值。几乎可以肯定,这并非本意

因为第一个匹配的case获胜并且case OKAY始终匹配,所以将永远不会检查其他case子句

这就解释了错误消息:

SyntaxError: name capture 'OKAY' makes remaining patterns unreachable

解决问题的关键

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

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

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: ...

除了创建类或模块外,还可以创建integer enumeration以实现相同的效果:

from enum import IntEnum

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

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

示例解

这是一个解决原始问题的解决方案。枚举属性查找的.的存在是匹配案例将其识别为value pattern的关键:

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')
        

相关问题 更多 >