`如果输入dict“vs.”“try/except”-哪个更容易阅读?

2024-05-18 23:27:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于习惯用法和可读性的问题,对于这个特殊的情况,Python哲学似乎有冲突:

我想从字典B构建字典A。如果B中不存在特定的键,则不执行任何操作并继续。

哪种方式更好?

try:
    A["blah"] = B["blah"]
except KeyError:
    pass

或者

if "blah" in B:
    A["blah"] = B["blah"]

“做和请求原谅”与“简单明了”的比较。

哪个更好,为什么?


Tags: inif字典方式情况passblah可读性
3条回答

据我所知,您想用dict B中的键、值对更新dict A

update是一个更好的选择。

A.update(B)

示例:

>>> A = {'a':1, 'b': 2, 'c':3}
>>> B = {'d': 2, 'b':5, 'c': 4}
>>> A.update(B)
>>> A
{'a': 1, 'c': 4, 'b': 5, 'd': 2}
>>> 

例外不是条件。

有条件的版本更清晰。这是很自然的:这是直接的流控制,这是为条件设计的,而不是例外。

在循环中执行这些查找时,异常版本主要用作优化:对于某些算法,它允许从内部循环中消除测试。在这里没有好处。它的一个小优点是它可以避免说"blah"两次,但是如果你做了很多这样的事情,你可能还是应该有一个helpermove_key函数。

一般来说,我强烈建议在默认情况下坚持使用条件版本,除非您有特定的理由不这样做。条件句是实现这一点的明显方法,这通常是一个强烈的建议,即选择一种解决方案而不是另一种解决方案。

还有第三种方法可以避免异常和双重查找,如果查找代价高昂,这一点很重要:

value = B.get("blah", None)
if value is None: 
    A["blah"] = value

如果您希望字典包含None值,则可以使用一些更深奥的常量,如NotImplementedEllipsis,或者创建一个新的常量:

MyConst = object()
def update_key(A, B, key):
    value = B.get(key, MyConst)
    if value is not MyConst: 
        A[key] = value

无论如何,使用update()对我来说是最可读的选项:

a.update((k, b[k]) for k in ("foo", "bar", "blah") if k in b)

相关问题 更多 >

    热门问题