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 来反映代码。
相关文章
Pandas DataFrame DataFrame.shift() 函数
发布时间:2024/04/24 浏览次数:133 分类:Python
-
DataFrame.shift() 函数是将 DataFrame 的索引按指定的周期数进行移位。
Python pandas.pivot_table() 函数
发布时间:2024/04/24 浏览次数:82 分类:Python
-
Python Pandas pivot_table()函数通过对数据进行汇总,避免了数据的重复。
Pandas read_csv()函数
发布时间:2024/04/24 浏览次数:254 分类:Python
-
Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。
Pandas 多列合并
发布时间:2024/04/24 浏览次数:628 分类:Python
-
本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。
Pandas loc vs iloc
发布时间:2024/04/24 浏览次数:837 分类:Python
-
本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。
在 Python 中将 Pandas 系列的日期时间转换为字符串
发布时间:2024/04/24 浏览次数:894 分类:Python
-
了解如何在 Python 中将 Pandas 系列日期时间转换为字符串