Python 中的嵌套 try/ except 块是一种良好的编程习惯吗?

2023-12-25

我正在编写自己的容器,它需要通过属性调用来访问内部的字典。容器的典型用法如下:

dict_container = DictContainer()
dict_container['foo'] = bar
...
print dict_container.foo

我知道写这样的东西可能很愚蠢,但这就是我需要提供的功能。我正在考虑通过以下方式实现这一点:

def __getattribute__(self, item):
    try:
        return object.__getattribute__(item)
    except AttributeError:
        try:
            return self.dict[item]
        except KeyError:
            print "The object doesn't have such attribute"

我不确定嵌套的 try/ except 块是否是一个好的做法,所以另一种方法是使用hasattr() and has_key():

def __getattribute__(self, item):
        if hasattr(self, item):
            return object.__getattribute__(item)
        else:
            if self.dict.has_key(item):
                return self.dict[item]
            else:
                raise AttributeError("some customised error")

或者使用其中之一和一个 try catch 块,如下所示:

def __getattribute__(self, item):
    if hasattr(self, item):
        return object.__getattribute__(item)
    else:
        try:
            return self.dict[item]
        except KeyError:
            raise AttributeError("some customised error")

哪个选项最Pythonic、最优雅?


你的第一个例子非常好。甚至 Python 官方文档也推荐这种风格,称为EAFP https://docs.python.org/3/glossary.html#term-EAFP.

就我个人而言,我更喜欢在不必要时避免嵌套:

def __getattribute__(self, item):
    try:
        return object.__getattribute__(self, item)
    except AttributeError:
        pass  # Fallback to dict
    try:
        return self.dict[item]
    except KeyError:
        raise AttributeError("The object doesn't have such attribute") from None

PS. has_key()在 Python 2 中已被弃用很长时间。使用item in self.dict反而。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的嵌套 try/ except 块是一种良好的编程习惯吗? 的相关文章

随机推荐

  • 以编程方式设置 java.awt.headless=true

    我正在尝试设置java awt headless true在应用程序启动期间 但似乎我来得太晚了 非无头模式已经开始 static System setProperty java awt headless true java awt Gra
  • 在 FFMPEG 中对数据流和视频进行编码

    我想将一些专有数据 它是每帧的序列化无符号 64 位整数 编码到视频容器 mp4 作为数据流 但我无法找到任何人执行此操作的说明 教程 我唯一能找到的是这个 它描述了如何创建数据流 用户显然没有成功https lists libav org
  • 如何在 HTML 中创建泪滴?

    如何创建这样的形状以显示在网页上 我不想使用images因为它们在缩放时会变得模糊 我尝试过CSS tear display inline block transform rotate 30deg border 5px solid gree
  • Plotly:并排条形图和饼图

    我想使用并排绘制条形图和饼图subplot函数在plotly然而 在图形的中心绘制了一个大饼图 覆盖了条形图 这是示例代码 Animals lt c giraffes orangutans monkeys SF Zoo lt c 20 14
  • Android Native 在 /system/lib/libskia.so 崩溃(位图处理)

    我需要帮助解决影响 Play 商店中应用程序的错误 Play 开发者控制台上的崩溃报告 此崩溃仅限于某些安卓4 4 devices 无法在模拟器上重现崩溃 堆栈跟踪发生在本机代码 而不是 Java 上 因此很难看出此错误是在哪里调用的 研究
  • 使用 jcifs 读取文件的最简单方法

    我正在尝试使用外部从网络共享读取文件jcifs图书馆 https jcifs samba org 我能找到的大多数用于读取文件的示例代码都非常复杂 甚至可能不必要 我找到了一个简单的方法write到如下所示的文件 有没有办法使用类似的语法读
  • 声明框架中结构的简单协议一致性

    是否可以声明 struct 是在框架中定义的结构 它基本上符合在我的应用程序中定义的协议 举例来说 我有一个 API 它为框架中建模的一些小部件声明结构 public struct VagueWidget public let temper
  • 如何比较 Boost 几何形状?

    我有 2 个 升压 几何 模型 环 我试图判断它们是否相同 是否有内置的增强几何比较函数 方法可以为我解决这个问题 boost geometry equals a b 报告两个几何图形在空间上是否相等
  • WSO2 ESB 5 中的动态 json-eval 表达式

    我正在尝试使用动态生成的 json eval 来处理 JSONPayload 以选择特定的酒店对象 下面提到的直接 json eval 工作得很好 直接 json eval 表达式 json eval content hotelcode A
  • 从 HTML5 存储打开 PDF

    我想将 pdf 文件客户端存储在 HTML5 存储之一 indexedDB 或 localstorage 中 然后稍后使用 adobe reader 打开它们 场景如下 用户访问了我的网站并将一堆 pdf 下载到存储中 稍后 用户重新访问该
  • 获取现有的 NSLayoutConstraint 宽度?

    我正在尝试使用自动布局为 Cocoa 中的控件设置动画 现在 我可以设置 constraint animator setConstant newWidth 有效 但我怎样才能得到正确的约束呢 With self constraints 你可
  • 没有适用于应用内购买的信息。稍后再试。 21105

    昨天 当我从任何地方测试我的应用程序时 这个错误开始出现 打电话时发生这种情况restoreCompletedTransactions 在应用程序启动时 此错误是什么意思 我可以采取什么措施来避免此错误 这是苹果的内部服务器造成的 根据我几
  • 如何在 Visual Studio 2017 中运行 MSBuild 包目标

    我的问题类似于this https stackoverflow com questions 40661918 how do you create a nuget package from a net core msbuild project
  • 函数式编程语言的静态分析器,例如Scheme

    我很少看到像Racket Scheme这样的函数式编程语言的静态分析器 我什至怀疑是否有 我想为函数式语言编写一个静态分析器 比如Scheme Racket 我该怎么办 是的 有一些关于像Scheme这样的动态语言的静态分析的工作 例如 请
  • Networkx 中的图论

    我现在开始使用这个界面 我有一些 Python 经验 但没什么广泛的 我正在计算一个小图的传递性和社区结构 import networkx as nx G nx read edgelist data delimiter nodetype s
  • Vercel 导致 500:内部服务器错误(在本地主机上运行)

    我正在创建一个页面 可以在其中概述我的所有笔记 摘要 笔记的页面是转换为动态文件中使用的 HTML 的 Markdown 文件 note 页面是一页 包含一组所有笔记 现在我想实现一个搜索功能来对笔记进行排序 当我跑步时npm run de
  • 根据 R 中其他列中的最早日期值创建新列

    我有一个数据框 如下所示 Subject c 1 1 1 1 2 2 2 2 OBS c 1 3 2 4 3 3 4 2 1 2 2 7 3 6 4 9 REFDATE as Date c 2013 09 25 2013 09 25 201
  • IntelliJ IDEA 无法识别资源目录中 GraphQL 模式的格式

    我有一个 Spring Boot 项目GraphQL in 智能IDEA IntelliJ IDEA 无法识别 graphqls架构的格式 但显示错误消息 图像未加载 它在 IntelliJ 中的外观如下 我缺少什么 根据你的 graphq
  • 如何将 Subversion 日志导出到电子表格

    有没有办法将 Subversion 日志消息导出为电子表格 excel csv 等 格式 从 TortoiseSVN 中的日志消息窗口复制时 它会按以下格式粘贴文本 Revision 174 Author CARDINALHEALTH en
  • Python 中的嵌套 try/ except 块是一种良好的编程习惯吗?

    我正在编写自己的容器 它需要通过属性调用来访问内部的字典 容器的典型用法如下 dict container DictContainer dict container foo bar print dict container foo 我知道写