Python中的可选链

Python是一种编程语言,主要用于系统脚本、服务器端网络开发和软件开发。同时,它由简单的语法组成,提高了代码的可读性。

在Python的功能中,可选链是访问嵌套对象属性的一种安全而简洁的方式。它是调用和查询当时可能为空或可能不为空的属性的过程。

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

可选链检查留给操作者的属性是定义还是未定义。如果该属性不是null ,则调用成功,如果无效或未定义则返回未定义。

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

这个概念是最近由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 包含了用于处理将指令传递给程序时发生的错误的语句。

当一个程序执行时,可能会发生异常。然后它们通过打印出显示错误和错误发生过程的信息来中断程序。

为了防止中断,我们必须捕捉它们。所以,像这样处理异常将有助于得到防错的代码。

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

如果用户试图做一个无效的属性引用,引用就会失败,AttributeError 可能发生。另外,拼写变化也会引发AttributeError

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

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

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

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

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

但是,如果命名的属性不存在,则返回默认值或抛出一个AttributeError

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

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

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

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

字典是一个有序的、可改变的、不重复的数据值的集合,以key: value 对的形式存储。这里,'foo','bar', 和'baz' 是我们在 Python 中使用的占位符。

{'foo': {'bar': 'baz'}} 是字典,有了它,我们使用两个 函数,一个是 ,一个是 。这里, 函数返回带有指定键的项目值。get key value 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

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

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

getattr 作为一个落入式实现Python中的可选链路

我们可以把它作为一个drop-in使用,而不需要像上面那样扩展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 。此外,dc 的对应值。

之后,函数glom ,里面有targeta.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 部分获得了结果。

在使用这个函数时,我们必须在第一个参数后添加keys

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

结论

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

如果我们知道我们解决的过程和性能问题,我们可以使用tryexcept 方法,并避免过早的优化。另外,我们还可以通过使用getattr ,对代码进行反思。