Python 由于命名空间/键名冲突,捕获特定字典解包异常(TypeError)
我的问题是:我想可靠地捕获由多个未打包字典的名称空间冲突引起的错误。什么是规范的方式?搜索并没有显示对这个问题有任何帮助 假设我有两个类似dict的变量,它们带有字符串键,我想将它们混合在一起。它们表示具有相似名称空间的对象,因此我希望确保它们没有任何名称冲突。我可以这样做,冲突会给我一个Python 由于命名空间/键名冲突,捕获特定字典解包异常(TypeError),python,Python,我的问题是:我想可靠地捕获由多个未打包字典的名称空间冲突引起的错误。什么是规范的方式?搜索并没有显示对这个问题有任何帮助 假设我有两个类似dict的变量,它们带有字符串键,我想将它们混合在一起。它们表示具有相似名称空间的对象,因此我希望确保它们没有任何名称冲突。我可以这样做,冲突会给我一个TypeError: >>> d1 = dict(a=1) >>> d2 = dict(a=2) >>> format_args = dict(**d1,
TypeError
:
>>> d1 = dict(a=1)
>>> d2 = dict(a=2)
>>> format_args = dict(**d1, **d2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type object got multiple values for keyword argument 'a'
但是,尝试解压缩非映射类型的对象也会出现TypeError
:
>>> x=1
>>> d=dict(**x)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: type object argument after ** must be a mapping, not int
然而,他称这种方法“脆弱”,我倾向于同意
这是Python。一定有更好的办法
更新
也许最好的办法就是:
def kwargs_mash(kwargs1, kwargs2):
# ensure compatible arguments
kwargs1, kwargs2 = od(**kwargs1), od(**kwargs2)
# continue as before...
如果你对自己的论点知之甚少,甚至无法预测它们会是什么类型,那么你可能不得不抛出大量的
isinstance
。@deceze可能是对的。我倾向于坚持Python的禅宗思想,避免使用这些东西,但有时确实需要它。为什么不自己实现两个映射的合并呢?然后您将能够可靠地检测冲突。我建议使用这个选项,因为它似乎不需要比当前版本更多的代码solution@Leon事实上,我担心我会以一种幼稚的方式完成它,并最终导致缓慢的实现。但这可能是我在这里需要做的。
def kwargs_mash(kwargs1, kwargs2):
try:
# use unpacking to disallow multiple argslists to same member name
args = od(**kwargs1, **kwargs2)
except TypeError as exc:
if 'multiple values for keyword argument' in str(exc):
key_conflict = next(k for k in kwargs1 if k in kwargs2)
# more descriptive error message
raise TypeError('Multiple argument sets provided under member name: {}.'.format(key_conflict)) from None
else:
raise
def kwargs_mash(kwargs1, kwargs2):
# ensure compatible arguments
kwargs1, kwargs2 = od(**kwargs1), od(**kwargs2)
# continue as before...