使用Python中的* args和** kwargs验证具有默认值的参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python中的* args和** kwargs验证具有默认值的参数相关的知识,希望对你有一定的参考价值。
我一直在寻找答案,但我总是最终看到涵盖基础知识的教程。我的问题是 -
如果我有一个功能:
def foo(a, b, *args, **kwargs):
if args[0]:
if args[0] in range(1, 4):
x=args[0]
else:
raise ValueError("Eww that is one ugly x!")
else:
x = kwargs.get('x', 3)
if args[1]:
if args[1] in ['some','list','of','strings']:
y = args[1]
else:
raise ValueError("Invalid y")
else:
y = kwargs.get('y', "some")
if x == 1:
print("Good")
elif x == 2:
print("Bad")
elif x == 3:
print("Clint")
else:
raise ValueError("Eww that is one ugly x!")
if y == 'some':
print(y + str(x))
elif y == 'list':
print("happy")
elif y == 'of':
print("healthy")
elif y == 'strings':
print(y + 'me')
else:
raise ValueError("Invalid y")
我正在寻找一种更简单的方法来将args [0]和kwargs.get('x')视为等价 - 只要我想执行相同的类型和值验证检查。简而言之,我如何将args [i]和kwargs.get(k)的值映射到同一个对象。
答案
假设你真的希望你的函数依赖于args和kwargs,你可以做一个try / except语句(告诉你args [0]是否存在)并使用你的ValueError在两种情况下相同的事实。
def foo(*args, **kwargs):
try:
x = args[0] if args[0] in range(1,4) else None
except:
x = kwargs.get('x', 3)
if x == 1:
print("Good")
elif x == 2:
print("Bad")
elif x == 3:
print("Clint")
else:
raise ValueError("Eww that is one ugly x!")
另一答案
你应该像这样定义你的函数:
def foo(x):
if x == 1:
print("Good")
elif x == 2:
print("Bad")
elif x == 3:
print("Clint")
else:
raise ValueError("Eww that is one ugly x!")
现在你可以调用这个函数:
foo(3)
或作为:
foo(x=3)
如果您确切知道您期望的参数,则无需使用*args
或**kwargs
。
如果您需要更多参数,那么只需命名它们:
def foo(x, y, z, a, b, c):
...
如果你知道你期望什么参数,就没有必要使用*args
或**kwargs
。
以上是关于使用Python中的* args和** kwargs验证具有默认值的参数的主要内容,如果未能解决你的问题,请参考以下文章