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
包含了用于处理将指令传递给程序时发生的错误的语句。
当一个程序执行时,可能会发生异常。然后它们通过打印出显示错误和错误发生过程的信息来中断程序。
为了防止中断,我们必须捕捉它们。所以,像这样处理异常将有助于得到防错的代码。
这里我们考虑两个主要的错误:NameError
和AttributeError
。当我们使用一个未定义的变量或函数时,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
。
之后,我们可以用try
和except
控件来调整第一个讨论的方法。在try
和except
命令中,我们使用了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
。此外,d
是c
的对应值。
之后,函数glom
,里面有target
和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
部分获得了结果。
在使用这个函数时,我们必须在第一个参数后添加keys
。
obj = {'a': {'b': {'c': {'d': 1}}}}
print(optional_chain(obj, 'a', 'b'), optional_chain(obj, 'a', 'z'))
结论
总的来说,上面的方法是我们在Python中需要可选链时可以采用的方法。
如果我们知道我们解决的过程和性能问题,我们可以使用try
和except
方法,并避免过早的优化。另外,我们还可以通过使用getattr
,对代码进行反思。