首页 > 编程问答 >如何遍历Python字典同时避免KeyErrors?

如何遍历Python字典同时避免KeyErrors?

时间:2024-07-31 06:50:54浏览次数:12  
标签:python dictionary

解析大型 JSON 时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的 API 获取 200 OK 的情况并不少见,但是您得到的响应包含应检查的错误。

处理此问题的最佳方法是什么?

我知道使用类似 || 之类的东西。 |是处理 KeyError 的一种方法。 get() 但是如果我们需要继续下去怎么办?这感觉太可怕了:

if json.get('errors') is not None:
    do_something

有更好的方法吗?例如,

if json.get('errors') is not None:
   if json.get('errors').get('code') is not None:
      if json.get('errors').get('code') != 0:
         this_is_bad_throw_error

有一个 ruby 方法,基本上将整行压缩为 dig() ,然后您只需检查 x = dig(:errors, :code) 是否是 x 对象;所以 2 行,而不是 4 行(或者更多,如果你必须继续深入的话)。 nil 我之前用过

来捕捉 try-except ,但这不是我一定关心的方法。|| |我并不反对外部库,但由于代码运行的位置,坚持使用内置库是非常有利的。 KeyError , but this isn't an approach I necessarily care for.

I'm not against external libraries, but due to the location of where the code is being run it's extremely beneficial to stick to built-ins.


在 Python 中遍历字典并同时避免 KeyError 的最佳方法有几种,具体取决于的代码风格和目标。以下是一些选项:

1. get() 方法及其替代方法

提到了 get() 方法,这是一个很好的开始。它允许指定一个默认返回值(默认为 None ),如果找不到该键,则返回该值。可以链接 get() 调用以深入嵌套字典,但正如所指出的,这可能会变得冗长。

这是一个更简洁的替代方案,它使用短路评估:

error_code = json.get('errors') and json.get('errors').get('code')

if error_code and error_code != 0:
  # 处理错误

在这个例子中,如果 json.get('errors') 返回一个真值(例如,一个非空字典),那么表达式将继续求值到 json.get('errors').get('code') 。如果第一个 get() 返回 None ,则整个表达式将短路为 None ,而不会引发 KeyError

2. try-except 块(带有改进)

虽然提到不太喜欢 try-except 块,但它们可以非常有效且易读,尤其是在处理多个嵌套键时。 以下是如何改进它们以提高可读性的方法:

try:
  error_code = json['errors']['code']
  if error_code != 0:
    # 处理错误
except KeyError:
  # 处理缺少的键

此方法尝试直接访问嵌套键。 如果任何键不存在,则会引发 KeyError ,并且代码会执行 except 块。

3. 自定义“dig”函数

如果喜欢 Ruby 的 dig 方法,可以轻松地在 Python 中创建自己的版本:

def dig(data, *keys):
  for key in keys:
    if isinstance(data, dict) and key in data:
      data = data[key]
    else:
      return None
  return data

error_code = dig(json, 'errors', 'code')

if error_code and error_code != 0:
  # 处理错误

此函数接受一个数据结构(例如的 JSON 字典)和任意数量的键。 它迭代这些键,并尝试在每一步深入到嵌套的数据结构中。 如果在任何时候找不到键或数据结构不是字典,它将返回 None

选择正确的方法

最终,选择最适合的方法取决于的具体需求和偏好。

  • 如果只需要检查几个嵌套键, get() 方法及其短路评估变体提供了一种简洁易读的解决方案。
  • 如果需要处理多个嵌套键或执行更复杂的错误处理, try-except 块提供了一种更结构化且可能更易读的方法。
  • 如果发现自己在多个地方需要这种“深度挖掘”功能,那么创建自定义 dig 函数可以提高代码的可重用性和可读性。

标签:python,dictionary
From: 78813866

相关文章

  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......
  • Python多处理池不启动多个进程
    我正在尝试使用多处理池来创建多个进程。我有一个工作函数dummy_proc定义如下:importrefrommultiprocessingimportPooldefregex_check(input_string):#Patterntomatchboth"pm_lat"and"pm_lon_coslat"followedbytwofloatspattern=r"(c......
  • 迟滞建模作为 Python GEKKO 中 MPC 的控制约束
    我试图使用PythonGEKKO在用于控制信号调度的MPC优化问题中引入滞后约束。这已成为一项艰巨的任务,因为我无法将以下问题转换为GEKKO理解的方程。问题:如果开启时间<最短开启时间,则给定资产的控制调度不应将其关闭。如果关闭时间<最小关闭时间......
  • 在 Lambda Python 中获取 errorMessage": "期望值: 第 1 行第 1 列 (char 0)"
    我正在尝试使用slackapi和awslambda函数创建一个slack机器人。现在我只希望每当用户说“你好”时它就响应“你好”。当我在Lambda代码编辑器中测试代码时,出现此错误。我对Lambda很陌生,并且已经被困在这个问题上有一段时间了。非常感谢任何帮助!完整错误:Response......
  • 具有 Python lambda 函数的 QTimer 使用先前的数据运行
    我有一个GUI项目,它使用PySide2和Python3.8,它在QThread中执行一些后台任务。在该QThread中,我有QTimer成员对象,该对象必须定期运行一个函数,每次向其传递不同的数据。我没有使用QTimer.singleShot静态函数,因为如果需要某些特定场景,我需要......
  • 我如何在 python 上使用 spire.pdf 修复此错误
    我使用spirepdf,但出现以下错误:“DllNotFound_Windows,libSkiaSharp,Nosepuedeencontrarelmóduloespecificado.:....”defextract_text_from_pdf(file_path,output_file):#LoadaPDFdocumentdoc=PdfDocument()doc.LoadFromFile(file_path)ex......
  • C++ 函数返回极其缓慢,远慢于功能等效的 python 代码
    我有一个在我编写的脚本中使用的函数,用于从列表中删除多余的阻塞关键字。基本上,输入(以任何顺序):{"apple","bapple","banana","cherry","bananaman","sweetherrypie","sweet","b"}它应该输出一个缩小的字符串数组(以任何顺序):......
  • 在预定时间从 python telegram bot 发起对话
    对于没有提供代码,我提前表示歉意。我明天会尝试添加它,但我现在还没有接近它,思考如何解决这个问题让我一直在思考。我已经为一个机器人创建了一个程序,该程序的数据帧充满了之前请求的用户添加到机器人的消息列表中。现在,机器人使用job_queue在一天中的随机时间向每个用户发......
  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......