当前位置: 首页 > 知识库问答 >
问题:

捕获使剩余模式无法访问

况承福
2023-03-14

此代码为何失败:

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

该错误消息的含义是什么?如何修复代码以使其正常工作?

共有1个答案

薛焱
2023-03-14

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

它始终匹配并尝试为变量名赋值。这几乎肯定不是本意。

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

这解释了错误消息:

SyntaxError: name capture 'OKAY' makes remaining patterns unreachable

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

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

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

现在,案例响应代码。未找到:\u: 是一种值模式(因为有点),不会捕获。

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

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')
        
 类似资料:
  • 问题内容: 我一直在搜索有关此主题的信息,但仍然听不懂,如果有人可以详细说明,我将非常感激。 我的任务是将两个变量除以整数除以余数。问题是,我不知道余数是什么,现在我做了类似的事情,这是通过互联网搜索得到的: 如果我例如设置(a = 43)和(b = 67) 然后我会得到这个结果: 现在,由于我不知道其余的是什么(这只是来自互联网的建议),所以我不知道这是否是正确的答案。 谢谢你的帮助, 亲切的问

  • 问题内容: 如何使div填充剩余宽度? 我如何才能填满其余部分? 问题答案: 试试这样的事情: div自然会占用其容器的100%宽度,因此无需显式设置此宽度。通过添加与两侧div相同的左/右页边距,它自己的内容被强制置于它们之间。 请注意,“中间格”云 后 的HTML“正确的div”

  • 问题内容: 我正在尝试捕获“ android.database.sqlite.SQLiteException:错误代码5:数据库已锁定”异常,并带有: 由于某些原因,我仍然会收到错误消息,并且LogCat中没有显示“ caught”。我尝试捕获一般的“异常”,但这仍然行不通。怎么了? 更新, 我发现了这个问题,这确实很奇怪:由于某种原因,将goto10声明的db.insert()更改为db.ins

  • 问题内容: 尽管我在日志中看到了异常,但似乎无法捕获到约束违例异常。 实体 我正试图抓住它 -它永远不会到达捕获块。 当我使用 捕获(异常e) 我捕获到“ javax.transaction.RollbackException:ARJUNA016053:无法提交事务。” 这是错误日志: 我究竟做错了什么 ? 更新>> 我当前的代码是: 日志是 环境:PostgreSQL 9.2 JBoss AS

  • 我使用的是Spring Boot 2和Spring Boot starter数据jpa以及底层的MariaDB。 我有一个带有唯一键“用户名”的表。如果违反了此约束,我想捕获,但似乎Spring正在记录并且不会在记录后重新抛出(我最好的猜测)。被抛出。 我想在中捕获。 以下是几段代码片段: 堆栈跟踪:

  • 问题内容: 我的IDE给我该行的错误 我试着抓住,但是并没有使错误消失。有什么想法吗? 问题答案: 扩展了,所以您的IDE本身就有了更深的麻烦-也许库导入被搞砸了?