Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 由于命名空间/键名冲突,捕获特定字典解包异常(TypeError)_Python - Fatal编程技术网

Python 由于命名空间/键名冲突,捕获特定字典解包异常(TypeError)

Python 由于命名空间/键名冲突,捕获特定字典解包异常(TypeError),python,Python,我的问题是:我想可靠地捕获由多个未打包字典的名称空间冲突引起的错误。什么是规范的方式?搜索并没有显示对这个问题有任何帮助 假设我有两个类似dict的变量,它们带有字符串键,我想将它们混合在一起。它们表示具有相似名称空间的对象,因此我希望确保它们没有任何名称冲突。我可以这样做,冲突会给我一个TypeError: >>> d1 = dict(a=1) >>> d2 = dict(a=2) >>> format_args = dict(**d1,

我的问题是:我想可靠地捕获由多个未打包字典的名称空间冲突引起的错误。什么是规范的方式?搜索并没有显示对这个问题有任何帮助

假设我有两个类似dict的变量,它们带有字符串键,我想将它们混合在一起。它们表示具有相似名称空间的对象,因此我希望确保它们没有任何名称冲突。我可以这样做,冲突会给我一个
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...