使用Python中的* args和** kwargs验证具有默认值的参数

问题描述 投票:0回答:2

我一直在寻找答案,但我总是最终看到涵盖基础知识的教程。我的问题是 -

如果我有一个功能:

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)的值映射到同一个对象。

python arguments args kwargs
2个回答
0
投票

假设你真的希望你的函数依赖于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!")

0
投票

你应该像这样定义你的函数:

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

© www.soinside.com 2019 - 2024. All rights reserved.