【发布时间】:2020-04-09 03:38:29
【问题描述】:
我有一个函数,它的签名如下:
def func(**kwargs):
该函数的用户将使用零个或一个关键字参数调用该函数。如果他传递一个参数,名称将是foo_id、bar_id、baz_id 等,但我不知道他将使用的确切名称。传递参数的值将是一些整数。我仍然想采用该参数的值并使用它。
目前我正在这样做,但我想知道是否有更清洁的方法来实现这一点:
def func(**kwargs):
if kwargs:
target_id = list(kwargs.values())[0]
else:
target_id = None
# use target_id here, no worries if it's None
我使用的是 Python 3.8,所以向后兼容性不是问题。
【问题讨论】:
-
什么样的 API 有未预定义的关键字参数?对我来说听起来很矛盾。
-
@martineau 复杂的方式在这里全面解释。但简而言之:这将在 django 石墨烯突变的基类中使用,然后每个将采用一个参数。为了保持一致性,此参数始终是模型的名称和
_id。所以实际上没有人调用这个 Python 函数,但是调用者是 graphql api 的用户。 -
嗯,我知道你遗漏了细节,但听起来它仍然可能是XY problem,真正的问题在于类层次结构的设计。
-
@martineau 这个(就像任何其他问题一样)可以用一百万种不同的方式来解决。但是用一个抽象基类来做,所有需要该功能的模式都派生到它们自己的 Mutations,给我很少的重复代码和一个非常干净、一致且易于使用的 API。我对这个解决方案很满意。
标签: python python-3.x keyword-argument