定义一个带有动态参数的函数,来自用户的关键字参数并打印它们

Define a function with dynamic arguments, keyword arguments from user and print them

代码:

def myFun(*args, **kwargs):
    print("args: ", args)
    print("kwargs: ", kwargs)
args = input("Enter args: ")
kwargs = input("Enter kwargs: ")
myFun(args,kwargs)

输出:

Enter args: 1,2,3,4
Enter kwargs: a=5,b=6,c=7
args:  ('1,2,3,4', 'a=5,b=6,c=7')
kwargs:  {}

Process finished with exit code 0

这里的预期输出是:

args: (1,2,3,4)

kwargs: {'a':5,'b':6,'c':7}

我得到的输出不是预期的输出。

所以这里有几件事要注意,你的 args 是作为字符串出现的,因为它们是作为字符串传递的。 kwargsargs 是变量名,但 *args**kwargs 不是。所以你想做的可能是这样的:

def parseArgs(inputString):
    return(inputString.split(','))
def parseKWargs(inputString):
    d = {}
    for element in parseArgs(inputString):
        current = element.split('=')
        d[current[0]] = current[1]
    return(d)
def myFun(*args, **kwargs):
    print("args: ", args)
    print("kwargs: ", kwargs)
args = parseArgs(input("Enter args: "))
kwargs = parseKWargs(input("Enter kwargs: "))

myFun(*args, **kwargs)

kwargs 需要是一本字典并且“通过引用传递”我相信这是正确的表达方式。希望这有帮助。

感谢 wjandrea 的好收获

您可以使用列表和字典理解将要列表的用户 input 解析为 args,将字典解析为 kwargs,然后将它们解压缩到 myFun.

def myFun(*args, **kwargs):
    print("args: ", args)
    print("kwargs: ", kwargs)

args = [int(i) if i.isdigit() else i for i in input("Enter args: ").split(",")]
kwargs = {i.strip().split("=")[0]: int(i.strip().split("=")[1]) if i.strip().split("=")[1].isdigit() else i.strip().split("=")[1] for i in input("Enter kwargs: ").split(",")}

myFun(*args, **kwargs)

进入

Enter args: 1,2,3,4
Enter kwargs: a=5,b=6,c=7

输出

args:  (1, 2, 3, 4)
kwargs:  {'a': 5, 'b': 6, 'c': 7}