为什么在 Python 中“请求宽恕比获得许可更容易”?

2024-06-18

为什么“请求宽恕比获得许可更容易”(EAFP https://docs.python.org/2/glossary.html#term-eafp)在Python中被认为是好的实践吗?作为一名编程新手,我的印象是使用很多try...except与使用其他检查相比,例程宁愿导致代码臃肿且可读性较差。

EAFP 方法的优点是什么?

注意:我知道这里也有类似的问题,但它们大多指的是一些具体的例子,而我对原理背后的哲学更感兴趣。


您在这里混合了两件事:断言和基于 EAFP 的逻辑。

断言用于验证函数的契约,即其前置条件和后置条件,有时还有其不变量。它们确保函数按照应有的方式使用。但它们不适用于代码流,因为它们会在出现错误时完全中断执行。一个常见的例子是检查None函数调用中的参数。

在 Python 中,通常避免过多使用断言。一般来说,您应该expect您的代码的用户正确使用它。例如,如果您记录了一个函数,该函数接受的参数不是None,那么就没有必要有一个断言来验证这一点。相反,只是期望有一个值。如果由于 None 值而出现错误,那么无论如何它都会冒泡,因此用户知道他们做错了什么。但您不必一直检查所有内容。

现在,EAFP 有所不同。它用于控制流,或者更确切地说,它避免了额外的控制流,有利于期望事情是正确的,并在不正确时捕获异常。显示差异的一个常见示例是字典中的键访问:

# LBYL
if key in dic:
    print(dic[key])
else:
    handleError()

# EAFP
try:
    print(dic[key])
except KeyError:
    handleError()

现在这看起来非常相似,尽管您应该记住 LBYL 解决方案会检查字典twice。与捕获异常的所有代码一样,只有当某个键不存在时才应该执行此操作。特殊情况。因此,如果通常情况下,提供的密钥不在字典中,那么它就是 EAFP,您应该直接访问它。如果你不希望字典中出现该键,那么你应该首先检查它是否存在(虽然 Python 中的异常更便宜,但它们仍然不是免费的,所以保留它们以备特殊情况使用)。

EAFP 的一个好处还在于,在您的库或应用程序的逻辑深处,key来自上面,您可以假设这里传递了有效的密钥。因此,您不需要在这里捕获异常,而只需让它们冒泡到代码中的更高点,然后您就可以在其中处理错误。这使您可以拥有完全不受此类检查的较低级别的函数。

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

为什么在 Python 中“请求宽恕比获得许可更容易”? 的相关文章

  • X 轴刻度标签按年份,X 轴网格线按财政季度

    我试图将 x 轴刻度标签设置为年份 但将网格线设置为财政季度 数据很简单 只是一个groupby date count 见下文 每个日期都有一个计数 我将其绘制为线图 rc rc form Bakken rc tgt oil groupby
  • 嵌套生成器表达式 - 意外结果[重复]

    这个问题在这里已经有答案了 这是测试代码 units 1 2 tens 10 20 nums a b for a in units for b in tens units 3 4 tens 30 40 x for x in nums 假设第
  • Django 1.6:清除一张表中的数据

    我有一个名为 UGC 的表 想要清除该表中的所有数据 我不想重置整个应用程序 这也会删除所有其他模型中的所有数据 是否可以只清除一个模型 我还为我的应用程序配置了 South 如果这有帮助的话 你可以使用原始 SQL https docs
  • 从networkx中的文件中读取具有pos属性的节点

    我是 Networkx 的新手 我有一个包含以下格式的节点位置的文件 0 23 23 12 23 where 0是一个节点 23 23 and 12 23分别是X和Y坐标 有谁知道如何读取节点pos属性 使用类似的函数read edgeli
  • 使用 selenium 和 python 在网页网格中抓取 javascript 数据

    我的问题是我需要包含网站子域的网格中的所有数据https applipedia paloaltonetworks com https applipedia paloaltonetworks com 包含名称 类别 子类别 风险 技术的数据
  • 使用不带引号的块样式的 Python YAML 转储

    如何使用 PyYAML 加载和转储 YAML 以便它尽可能地使用原始样式 我有 Python 来加载和转储 YAML 数据 例如 import sys import yaml def represent dictorder self dat
  • 搜索/替换 xml 内容

    我已经成功地使用 xml etree ElementTree 解析 xml 搜索内容 然后将其写入不同的 xml 然而 我只是处理单个标签内的文本 import os sys glob xml etree ElementTree as ET
  • 我如何知道Python的unicode函数识别的所有支持的编码

    Python 有一个unicode将字节流转换为 unicode 字符串的内置函数 我只是希望我能查询所有可用的encoding在我的系统上 但如何 这个问题的原因是 有人使用 MAC OS X 向我发送了一封内容编码为 iso 2022
  • 为什么 scikit-learn SVM.SVC() 非常慢?

    我尝试使用SVM分类器来训练大约10万个样本的数据 但我发现它非常慢 甚至两个小时后也没有任何反应 当数据集有大约 1k 个样本时 我可以立即得到结果 我还尝试了 SGDClassifier 和朴素贝叶斯 速度相当快 几分钟内就得到了结果
  • 将 postgres 连接到 django 时遇到问题

    以下文档来自Django Postgres 文档 https docs djangoproject com en 4 1 ref databases postgresql notes我添加到我的settings py 在我设置的设置中 DA
  • python osmnx - 仅提取一个国家的大型高速公路

    我知道可以通过 OSMNX python 包提取城市的道路网络 详情请参阅https geoffboeing com 2016 11 osmnx python street networks https geoffboeing com 20
  • 如何向 Jupyter (ipython) 笔记本自动添加扩展?

    我已经安装了扩展 calico document tools 我可以使用以下命令从 Jupyter 笔记本中加载它 javascript IPython load extensions calico document tools 如何为每个
  • 将列表列表替换为“压缩”列表列表,同时保持顺序

    我有一个列表列表 如我所附的代码所示 如果有任何共同值 我想链接每个子列表 然后我想用列表的精简列表替换列表的列表 例子 如果我有一个清单 1 2 3 3 4 I want 1 2 3 4 如果我有 4 3 1 2 3 I want 4 3
  • 在Python中将月份和年份的列合并为季度和年份的列

    我有一个数据框 df Month 1 8 Year 2015 2020 df pd DataFrame data df df 想要将其转变为新列 期望的输出 df Month 1 8 Year 2015 2020 Quarter Q1201
  • dask分布式内存错误

    在分布式作业上运行 Dask 时 我在调度程序上遇到以下错误 distributed core ERROR Traceback most recent call last File usr local lib python3 4 dist
  • 构建wheel失败/“错误:INCLUDE环境变量为空”

    我正在使用 Python 2 7 11 并尝试 pip install 模块 但是其中一些模块失败了 我收到的消息是 无法为 X 构建轮子 和 错误 包含环境变量为空 我尝试安装 Scrapy LXML 和 Twisted 但都失败了 我尝
  • pip 升级到 pip 10.x.x 后解析需求文件的正确方法?

    所以今天我确实发现随着发布pip 10 x x the req软件包更改了其目录 现在可以在下面找到pip internal req 由于通常的做法是使用parse requirements功能在你的setup py从需求文件中安装所有依赖
  • Maya python 连接选择的属性

    我一直在尝试制作一个简单的脚本 它将采用两个视口选择 然后基本上将第二个视口的旋转连接到第一个 我不确定如何正确地从视口选择中为对象创建变量 这是我的尝试 但不起作用 import maya cmds as cmds sel cmds ls
  • Python - 将列表作为参数传递给 SQL,以及更多变量

    我试图在 python 3 6 中将未知数量的参数传递给 SQL Server 这是我使用 pypyodbc 的代码 cursor cnxn cursor theargs 1033286869 1053474957 1063654630 1
  • 合并共享属性的节点

    EDITED 我真的需要 Networkx graph 专家的帮助 假设我有以下数据框 我想将这些数据框转换为图表 然后我想根据描述和优先级属性将两个图映射到相应的节点 df1 From description To priority 10

随机推荐

  • Chrome 扩展程序中后台页面和弹出页面之间的通信

    我目前正在尝试为 Google Chrome 编写一个扩展 可用于上传文件 有两个页面 后台页面和弹出页面 单击多功能栏右侧的图标时会出现弹出页面 您可以使用标准 HTML 指定要上传的文件
  • Swig 从 Base* 向下转型为 Derived*

    我有以下 C 类 简化的 我使用 SWIG 将其暴露给 Python struct Component virtual void update struct DerivedComponent public Component void up
  • 在 PL/SQL 中将绑定变量与动态 SELECT INTO 子句结合使用

    我有一个关于 PL SQL 中的动态 SQL 语句中可以使用绑定变量的问题 例如 我知道这是有效的 CREATE OR REPLACE FUNCTION get num of employees p loc VARCHAR2 p job V
  • 使用 JQuery 从文本框中删除不需要的字符

    我想了解的是如何使用 JQuery 从文本框 或文本区域 中删除某些字符 我有 C 代码 但我似乎无法将其转换为 JQuery javascript 我的问题是 我不知道如何从文本框中获取字符数组的值 然后我可以循环遍历该值并与给定的不需要
  • Java-创建离散彩虹颜色数组

    很难描述我想要做什么 我基本上想创建一个离散的彩虹渐变 这样对于 i 个 JButton 的任何一行 它们之间的颜色渐变都会看起来彩虹 我已经完成了以下操作 但它实际上只创建了一个红色渐变 然后是绿色渐变 然后是蓝色渐变 Color c n
  • Firebase queryOrderedbyChild 不返回 Null 值

    我有一个根据年龄搜索用户的查询 self ref child users queryOrdered byChild age queryStarting atValue 18 queryEnding atValue 25 observeSin
  • 用于查找最近邻居的空间划分算法如何工作?

    为了找到最近的邻居 空间分区 http en wikipedia org wiki Nearest neighbor search Space partitioning是算法之一 它是如何工作的 假设我有一组 2D 点 x 和 y 坐标 并
  • 如何单独升级一个元素及其所有子元素

    Using componentHandler upgradeAllRegistered 升级 DOM 中的所有匹配元素 在我的例子中这是不必要的性能成本 当我在 DOM 中插入一个元素时 从父元素到根元素的任何内容都不需要重新升级 只有该元
  • Ruby on Rails:Cucumber:如何点击打开新窗口的链接?

    我有一个在新窗口中打开的链接 我需要测试该新窗口中的应用程序部分 任何建议将不胜感激 定义一个包含以下代码的步骤 page driver browser switch to window page driver browser window
  • ListView 滚动时隐藏和显示浮动按钮

    我正在我的应用程序中创建一个 listView 和一个浮动按钮 我希望根据滚动状态实现隐藏和返回的效果 当 的时候ListView滚动时按钮隐藏得很好 但是当滚动停止时按钮不会返回到其初始位置 有任何想法吗 My Code public c
  • 声明的包与预期的包“”不匹配

    我正在使用 Eclipse 有一段时间没有使用 Java 了 但是 我可以在命令行上编译我的代码并生成必要的 class文件 在 Eclipse 中 它抱怨说The declared package Devices does not mat
  • Android Studio 无法在 Mac OSX (Mavericks) 上加载 JVM

    我正在尝试在我的 Mac 上设置 Android Studio 它运行的是 OSX 10 9 1 Mavericks 我已经安装了最新的 JDK 在撰写本文时为 1 7 update 45 并且安装了 Android Studio 我使用
  • 无法加载文件或程序集“System.Data.SqlServerCe,版本=4.0.0.0”

    我在我的 C 代码中使用 Visual Studio 2012 Ultimate 和 SQL Server Compact 4 0 本地数据库 创建了一个 ASP NET 网站 不是 Web 应用程序 我能够成功编译网站并将其发布到另一个使
  • Android问题:Eclipse找不到ADB.exe

    首先 我知道这个问题之前已经被问过 即 在我的工具文件夹中找不到 adb exe https stackoverflow com questions 4659014 could not find adb exe on my tools fo
  • Xamarin:找不到“libmonodroid.so”模拟器错误

    我已经遇到这个问题几天了 但还没有找到解决方案 我一直在使用Android 7 0 ARM armeabi v7a 我的模拟器的图像 因为它太慢了 我一直在尝试使用Android 7 0 Intel Atom x86 64 with HAX
  • 图书馆神经实验室培训纽夫

    我对 python 和 Neurolab 的使用还很陌生 我在前馈神经网络的训练方面遇到了问题 我已经构建了如下网络 net nl net newff 1 1 64 60 1 net init testerr net train Input
  • 更改文本值的脚本 - Javascript

    从这个问题我开始知道文本元素的值可以通过JS改变设置选择列表中的最大项目数 html https stackoverflow com questions 6243303 set maximum number of item in selec
  • 如何使用Spring Boot设置ElasticSearch的数据目录

    我的问题类似于 1 https stackoverflow com questions 25687545 control elasticsearch configuration in spring data setup我有一个 Spring
  • 批处理脚本 - 逐行读取

    我有一个日志文件 我需要逐行读入并将该行传送到下一个循环 首先 我在一个单独的文件中 grep 日志文件中的 主 字 如 错误 以保持其较小 现在我需要获取单独的文件并逐行读取它 每行都需要进入另一个循环 在这些循环中我 grep 日志并将
  • 为什么在 Python 中“请求宽恕比获得许可更容易”?

    为什么 请求宽恕比获得许可更容易 EAFP https docs python org 2 glossary html term eafp 在Python中被认为是好的实践吗 作为一名编程新手 我的印象是使用很多try except与使用其