Python与React'的等价物是什么;组件中属性的分解?

Python与React'的等价物是什么;组件中属性的分解?,python,python-3.x,destructuring,Python,Python 3.x,Destructuring,我有一个具有许多属性的字典/对象。我想将其属性作为命名参数传递给Python中的函数 在React中,我可以使用属性分解: 如果props包含属性attr,它将被10覆盖 但是,在Python中,这不起作用: props={a:0,“b:1”,attr:3} def foo(a=None,b=None,attr=None): ... foo(**props,attr=10)#此操作失败 错误消息为关键字参数“attr”获取了多个值。当然,一个解决办法是事先移除该项目。然而,这似乎相当笨拙,

我有一个具有许多属性的字典/对象。我想将其属性作为命名参数传递给Python中的函数

在React中,我可以使用属性分解:


如果
props
包含属性
attr
,它将被10覆盖

但是,在Python中,这不起作用:

props={a:0,“b:1”,attr:3}
def foo(a=None,b=None,attr=None):
...
foo(**props,attr=10)#此操作失败

错误消息为关键字参数“attr”获取了多个值。当然,一个解决办法是事先移除该项目。然而,这似乎相当笨拙,我很好奇是否有更好的方法来实现这一点。

如果您使用的是Python 3.9+:

props={a:0,“b:1”,attr:3}
foo(**(道具(属性=10))
foo(**(道具{'attr':10}))
考虑到您使用的是Python 3.5+,您可以使用以下任何替代方案:

props={a:0,“b:1”,attr:3}
foo(**{**props,'attr':10})
foo(**{**props,**dict(attr=10)})
foo(**{**props,***{'attr':10})
如果您使用的是早期版本的Python:

从集合导入链映射
foo(**ChainMap({'attr':10},props))
请记住,为了向函数传递参数,您需要遵循以下顺序:

  • 位置参数
  • 关键字参数
  • *args
  • **kwargs

如果您使用的是Python 3.9+:

props={a:0,“b:1”,attr:3}
foo(**(道具(属性=10))
foo(**(道具{'attr':10}))
考虑到您使用的是Python 3.5+,您可以使用以下任何替代方案:

props={a:0,“b:1”,attr:3}
foo(**{**props,'attr':10})
foo(**{**props,**dict(attr=10)})
foo(**{**props,***{'attr':10})
如果您使用的是早期版本的Python:

从集合导入链映射
foo(**ChainMap({'attr':10},props))
请记住,为了向函数传递参数,您需要遵循以下顺序:

  • 位置参数
  • 关键字参数
  • *args
  • **kwargs

一次性不可能,因此在将其传递给函数之前必须更新
道具
更新(attr=10)
一次性不可能,因此在传递给函数之前必须更新
道具
更新(attr=10)
不幸的是,
foo(attr=10,**道具)
失败,并显示相同的错误消息。更新策略有效。我希望它可以在一行中实现。@lmiguevargasf
dict.update
返回
None
。@metatoaster,您完全正确。我刚刚更新了我的答案。请注意,此
**
扩展仅在Python 3.5中可用,因此,尽管通常情况下是可以使用的,某些特定的向后兼容性将需要链接线程中较旧的解决方案。也可能值得将您的答案添加到另一个线程中。不幸的是,
foo(attr=10,**props)
失败,并显示相同的错误消息。更新策略有效。我希望它可以在一行中实现。@lmiguevargasf
dict.update
返回
None
。@metatoaster,您完全正确。我刚刚更新了我的答案。请注意,此
**
扩展仅在Python 3.5中可用,因此,尽管通常情况下是可以使用的,某些特定的向后兼容性将需要链接线程中较旧的解决方案。也可能值得将您的答案添加到其他线程中。