python - 还有什么 pythonic : Using getattr or inline if statement to retrieve a default value

标签 python

我的问题是,

以下哪项更符合 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/

相关文章:

python - scipy.linalg.logm 产生错误,而 matlab 不会产生错误

python - 如何使用Python在Windows中设置代理?

python - python列表中的不连续切片

python - Django — 提高 `startswith` 性能

python - 如何访问字典内数组内的项目索引?

python - Keras - 大型图像和蒙版数据集生成器

python - 使用 EBO 时 OpenGL 崩溃

python - BeautifulSoup 使用两个不同的 div 类查找数据

python - 在 SQL 查询中使用字典键作为字段名称

python - Leetcode递归解法不起作用“最长子串不重复字符”