2024-05-18 23:27:52 发布
网友
我有一个关于习惯用法和可读性的问题,对于这个特殊的情况,Python哲学似乎有冲突:
我想从字典B构建字典A。如果B中不存在特定的键,则不执行任何操作并继续。
哪种方式更好?
try: A["blah"] = B["blah"] except KeyError: pass
或者
if "blah" in B: A["blah"] = B["blah"]
“做和请求原谅”与“简单明了”的比较。
哪个更好,为什么?
据我所知,您想用dict B中的键、值对更新dict A
update是一个更好的选择。
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函数。
"blah"
move_key
一般来说,我强烈建议在默认情况下坚持使用条件版本,除非您有特定的理由不这样做。条件句是实现这一点的明显方法,这通常是一个强烈的建议,即选择一种解决方案而不是另一种解决方案。
还有第三种方法可以避免异常和双重查找,如果查找代价高昂,这一点很重要:
value = B.get("blah", None) if value is None: A["blah"] = value
如果您希望字典包含None值,则可以使用一些更深奥的常量,如NotImplemented、Ellipsis,或者创建一个新的常量:
None
NotImplemented
Ellipsis
MyConst = object() def update_key(A, B, key): value = B.get(key, MyConst) if value is not MyConst: A[key] = value
无论如何,使用update()对我来说是最可读的选项:
update()
a.update((k, b[k]) for k in ("foo", "bar", "blah") if k in b)
据我所知,您想用dict B中的键、值对更新dict A
update
是一个更好的选择。示例:
例外不是条件。
有条件的版本更清晰。这是很自然的:这是直接的流控制,这是为条件设计的,而不是例外。
在循环中执行这些查找时,异常版本主要用作优化:对于某些算法,它允许从内部循环中消除测试。在这里没有好处。它的一个小优点是它可以避免说
"blah"
两次,但是如果你做了很多这样的事情,你可能还是应该有一个helpermove_key
函数。一般来说,我强烈建议在默认情况下坚持使用条件版本,除非您有特定的理由不这样做。条件句是实现这一点的明显方法,这通常是一个强烈的建议,即选择一种解决方案而不是另一种解决方案。
还有第三种方法可以避免异常和双重查找,如果查找代价高昂,这一点很重要:
如果您希望字典包含
None
值,则可以使用一些更深奥的常量,如NotImplemented
、Ellipsis
,或者创建一个新的常量:无论如何,使用
update()
对我来说是最可读的选项:相关问题 更多 >
编程相关推荐