Python 中的可选链
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 来反映代码。
相关文章
Python中另一个函数调用的模拟补丁一个函数
发布时间:2023/06/16 浏览次数:122 分类:Python
-
本篇文章介绍模拟对象及其重要性,并使用 patch() 作为装饰器、上下文管理器和手动启动/停止来演示如何模拟补丁由另一个函数调用的一个函数。
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 平方方法和二分搜索方法计算数组中最长的递增子序列。