在不知道其名称的情况下获取第一个通过的 kwarg 的 Pythonic 方法?
Pythonic way to get the first passed kwarg without knowing its name?
我有一个函数,其签名如下:
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,因此向后兼容性不是问题。
我们到了
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:
# ...
我有一个函数,其签名如下:
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,因此向后兼容性不是问题。
我们到了
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:
# ...