在不知道其名称的情况下获取第一个通过的 kwarg 的 Pythonic 方法?

Pythonic way to get the first passed kwarg without knowing its name?

我有一个函数,其签名如下:

def func(**kwargs):

该函数的用户将使用零个或一个关键字参数调用该函数。如果他传递一个参数,名称将是foo_idbar_idbaz_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,因此向后兼容性不是问题。

我们到了

def func(**kwargs):
    target_id = next(iter(kwargs.values()), None)

    print(target_id)


func(name_id='name')
func(value_id='value')
func(test_id='test')
func()

产出

python test.py
name
value
test
None

由于字典只有一项,不需要保留在字典中,最干净的方法是使用dict.popitem方法。这 returns 参数名称及其值作为一对。

def func(**kwarg):
    if kwarg:
        name, value = kwarg.popitem()
        # ...
    else:
        # ...

由于调用者最多应提供一个参数,因此我建议在使用更多参数调用时明确引发错误:

def func(**kwarg):
    if len(kwarg) > 1:
        raise TypeError(f'Expected at most 1 keyword arg, got {len(kwarg)}.')
    elif kwarg:
        name, value = kwarg.popitem()
        # ...
    else:
        # ...