迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

Python 中的可选链

作者:迹忆客 最近更新:2023/06/16 浏览次数:

Python 是一种主要用于系统脚本、服务器端 Web 开发和软件开发的编程语言。 此外,它包含提高代码可读性的简单语法。

在 Python 的特性中,可选链接是访问嵌套对象属性的一种安全而简洁的方式。 就是调用查询当时可能为null也可能不为null的属性的过程。

通过使用可选链接,我们可以在内部检查对象中的属性是否可用,而不是手动检查。

可选链接检查留给运算符的属性是已定义还是未定义。 如果该属性不为 null,则调用成功并返回 undefined(如果无效或未定义)。

在这里,它返回一个未定义的值而不是报告错误。 此外,即使该方法可能不存在,这也适用于函数调用。

这个概念最近由 ECMA 国际技术委员会 39 – ECMAScript 引入,作者是 Claude Pache、Gabriel Isenberg、Daniel Rosenwasser 和 Dustin Savery。

在编写更简洁的代码时,可选链接是一个很好用的特性。

下面是一些我们可以用来在 Python 中实现可选链的方法。 我们可以在构建函数时使用这些代码块。


使用 try-except 在 Python 中实现可选链

可选链接的最pythonic方式如下。

try:
    # statements

except (NameError, AttributeError) as e:
    # statements (else)

此方法使用 try 命令和 except 命令。 在 try 中,它包含用于控制流程的语句,而 except 包含用于处理在将指令传递给程序时发生的错误的语句。

当程序执行时,可能会发生异常。 然后他们通过打印一条显示错误及其发生方式的消息来中断程序。

为了防止中断,我们必须抓住它们。 因此,像这样处理异常将有助于获得防错代码。

这里我们考虑两个主要错误:NameError 和 AttributeError。 当我们使用未定义的变量或函数时,可能会发生 NameError。

如果用户尝试进行无效的属性引用,则引用将失败,并且可能会发生 AttributeError。 此外,拼写变体将引发 AttributeError。

如上所述,这种可选链接的 pythonic 方法有助于在处理异常时调用属性,即使它们已定义或未定义。


使用 getattr 在 Python 中实现可选链接

除了上述方法,使用 getattr 也是可选链接中的另一种方法。

getattr(getattr(foo, 'bar', None), 'baz', None)

这里我们使用 getattr 函数从指定对象返回指定属性的值。 对象名称应该是一个字符串,如果它是一个命名属性,它返回该属性的值。

但是,如果指定的属性不存在,则返回默认值或抛出 AttributeError。

在这个 getattr 函数中,getattr(foo, 'bar', None) 是对象,而 baz 是属性,None 是默认值。


使用 get(key, value) 在 Python 中实现可选链

当它是字典时,我们可以使用 get(key, value)

{'foo': {'bar': 'baz'}}.get('foo', {}).get('bar')

字典是存储为键值对的有序、可变和非重复数据值的集合。 这里,“foo”、“bar”和“baz”是我们在 Python 中使用的占位符。

{'foo': {'bar': 'baz'}} 是字典,有了它,我们使用两个带有键和值的 get 函数。 这里的 get 函数返回具有指定键的项目的值。

第一个 get 函数包含作为“foo”的键和 {} 的值,而第二个仅包含作为“bar”的键。

就像上面的代码片段一样,即使我们使用字典,我们也可以调整可选链的概念。


使用方法组合在 Python 中实现可选链接

下面是我们在可选链中可以遵循的另一种方法。 它是方法的组合。

from functools import reduce

def optional_chain(obj, keys):
    try:
        reduce(getattr, keys.split('.'), root)
    except AttributeError:
        return None

optional_chain(foo, 'bar.baz')

首先,我们必须从存储中间结果的 functools 中导入 reduce 模块,并只返回最终的总和。 然后使用两个参数定义函数 optional_chain。

之后,我们可以使用 try 和 except 控件调整第一个讨论的方法。 在 try 和 except 命令中,我们使用了 getattr 函数。

我们已经在第二种方法中描述了 getattr 的功能。 最后,我们通过定义两个参数来调用 optional_chain。


使用 getattr 作为 Drop-In 在 Python 中实现可选链接

我们可以将它用作插件,而无需像上面那样扩展 getattr。

from functools import reduce

def rgetattr(obj, attr, *args):
    def _getattr(obj, attr):
        return getattr(obj, attr, *args)
    return reduce(_getattr, attr.split('.'), obj)

导入模块后,我们定义了一个名为 rgetattr 的函数,带有三个参数。 然后我们将函数 getattr 定义为一个 drop-in。

如果路径不存在,rgetattr 将抛出 AttributeError,我们可以指定 default 而不是 None。


使用 glom 在 Python 中实现可选链

我们可以在可选链接中使用的另一种方法是使用 glom。

from glom import glom

target = {'a': {'b': {'c': 'd'}}}
glom(target, 'a.b.c', default=None)

作为第一步,我们应该从库中导入模块 glom。 然后目标已经以字典的形式定义了 a、b 和 c。 此外,d 是 c 的对应值。

之后,函数 glom 调用了其中的目标和 a.b.c。 如果发生任何异常,它将打印 None 作为默认值。


使用带有字典和对象的可读方法在 Python 中实现可选链接

通过适应以下方法,我们可以使代码在与字典和对象一起使用时更具可读性。

def optional_chain(root, *keys):
    result = root
    for k in keys:
        if isinstance(result, dict):
            result = result.get(k, None)
        else:
            result = getattr(result, k, None)
        if result is None:
            break
    return result

首先,它定义了一个名为 optional_chain 的函数,并进行了一个 for 循环和 if-else 语句。 它使用流中的 getattr 函数来获取 else 部分的结果。

使用此函数时,我们必须在第一个参数之后添加键。

obj = {'a': {'b': {'c': {'d': 1}}}}
print(optional_chain(obj, 'a', 'b'), optional_chain(obj, 'a', 'z'))

总结

总的来说,上述方法是我们在 Python 中需要可选链接时可以采用的方式。

如果我们知道我们解决的过程和性能问题,我们可以使用 try 和 except 方法并避免过早的优化。 此外,我们可以使用 getattr 来反映代码。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Python 四舍五入到最接近的十位

发布时间:2023/06/16 浏览次数:124 分类:Python

本篇文章将讨论使用 Python 的 ceil() 函数将数字四舍五入到最接近的十。Python 整数到最接近的十 Python 具有三个内置函数 round()、floor() 和 ceil(),可用于对数字进行舍入。

Python 中的模拟函数

发布时间:2023/06/16 浏览次数:127 分类:Python

Mock 是为与 unittest 一起使用而创建的,它基于操作到断言模式而不是大多数模拟框架中使用的记录到重播。 对于以前版本的 Python,有一个 unittest.mock 的反向移植。

基于 Python 中输入的模拟返回值

发布时间:2023/06/16 浏览次数:171 分类:Python

本文将介绍如何在 Python 中创建一个根据输入返回不同值的模拟函数。 我们还将向您展示如何测试我们的模拟函数。最后,我们将向您展示一些更高级的模拟函数的技术。

Python 模拟导入

发布时间:2023/06/16 浏览次数:129 分类:Python

在这篇 Python 文章中,我们将研究 mock 库并学习如何有效地使用它。 我们将从简单的示例开始,然后查看更高级的用法。Python 模拟导入 我们将学习模拟对象和模拟的用途和陷阱。

在 Python 中计算和显示凸包

发布时间:2023/06/16 浏览次数:142 分类:Python

因此,凸包是指围绕凸物体形状的边界。 本教程将教您在 Python 中计算和显示一组随机点的凸包。在 Python 中计算并显示一个凸包

Python 密码哈希

发布时间:2023/06/16 浏览次数:90 分类:Python

我们将了解密码散列以及如何使用名为 bcrypt 的第三方库加密 salt 和 hash 密码。 我们还研究了 Python 中 hashlib 库中的不同哈希算法。Python 中使用 bcrypt 库的 Salt 和 Hash 密码

Python 中的 Collatz 序列

发布时间:2023/06/16 浏览次数:180 分类:Python

Collatz数列是一种以1结尾的数字序列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。本文将解释如何编写程序,在 Python 中找到任何给定数字的 collatz 序列。Collatz 序列背后

Python 中的最长递增子序列

发布时间:2023/06/16 浏览次数:90 分类:Python

我们将学习什么是子序列以及如何使用 Python 中的 n 平方方法和二分搜索方法计算数组中最长的递增子序列。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便