如何评估
a = myobject.id.number
如果myobject为None,则返回None内置getattr?也许是getattr(myobject, "id.number", None)?
None
getattr
getattr(myobject, "id.number", None)
pu3pd22g1#
这应该可以很好地扩展到任何深度:
reduce(lambda obj, attr : getattr(obj, attr, None), ("id","num"), myobject)
3okqufwl2#
getattr(getattr(myobject, "id", None), "number", None)
应该可以。
kmpatx3s3#
我最喜欢的是
from functools import reduce try: a = reduce(getattr, ("id", "number"), myobject) except AttributeError: a = None
或
from operator import attrgetter try: a = attrgetter('id.number')(myobject) except AttributeError: a = None
wecizke34#
这里有一句俏皮话
a = myobject is not None and myobject.id.number or None
它不检查id是否为None,但这不是原始问题的一部分。
dhxwm5r45#
这是一个考虑到所有成员的略过于通用的解决方案:
if myobject and myobject.id and myobject.id.number: a = myobject.id.number else: a = None
guz6ccqo6#
return myobject.id.number if myobject else None
wswtfjt77#
我使用下面的函数,它可以为任何级别执行此操作。
def Resolve(object, attribute:str): """ Resolve attribute of an object. """ attribute_list = attribute.split(".") obj = object try: for att in attribute_list: obj = getattr(obj, att) except AttributeError: obj = None return obj
要使用它,您可以写入:
a = Resolve(myobject, 'id.number')
代码只是使用句点字符拆分字符串,并循环遍历属性。如果您有另一个级别,比如'myobject.id.number.another',您可以用途:
a = Resolve(myobject, 'id.number.another')
7条答案
按热度按时间pu3pd22g1#
这应该可以很好地扩展到任何深度:
3okqufwl2#
应该可以。
kmpatx3s3#
我最喜欢的是
或
wecizke34#
这里有一句俏皮话
它不检查id是否为None,但这不是原始问题的一部分。
dhxwm5r45#
这是一个考虑到所有成员的略过于通用的解决方案:
guz6ccqo6#
wswtfjt77#
我使用下面的函数,它可以为任何级别执行此操作。
要使用它,您可以写入:
代码只是使用句点字符拆分字符串,并循环遍历属性。如果您有另一个级别,比如'myobject.id.number.another',您可以用途: