我的问题是,
以下哪项更符合 Python 风格:
getattr(object, field, None)
与 object.field if object else None
我倾向于 if 语句,因为 getattr 似乎假设一个对象确实存在,并且我们正在检查该字段是否存在。这不是我们想要实现的目标。
此外,在进行基准测试时:if 语句始终快 4 倍。
编辑:
如果还不是很明显,那么这是伪代码。
最佳答案
好吧,我必须在答案中输入此内容,因为它超出了评论字符数限制。正如我在评论中提到的,这两种说法并不等同。
设置
class A(object):
def __init__(self, attr_name):
setattr(self, attr_name, 'hi')
a1 = A('my_attr')
a2 = A('other_attr')
以下是 getattr
语句的情况。
getattr(a1, 'my_attr', None) # evaluates to 'hi'
getattr(a2, 'my_attr', None) # evaluates to None
getattr(a3, 'my_attr', None) # raises NameError
以下是三元语句的情况。
a1.my_attr if a1 else None # evaluates to 'hi'
a2.my_attr if a2 else None # raises AttributeError
a3.my_attr if a3 else None # raises NameError
第二种情况在两种制度下是不同的。
此外,如果 A
的实例评估为 False
,则两种机制可能会以不同的方式有所不同。
class A(object):
def __init__(self, attr_name):
setattr(self, attr_name, 'hi')
def __bool__(self):
return False
a1 = A('my_attr')
a2 = A('other_attr')
getattr
语句的计算结果相同,但三元语句现在的计算结果如下:
a1.my_attr if a1 else None # evaluates to None
a2.my_attr if a2 else None # evaluates to None
a3.my_attr if a3 else None # raises NameError
现在,第一个案例在两种制度下是不同的。
关于python - 还有什么 pythonic : Using getattr or inline if statement to retrieve a default value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35779515/