代码之家  ›  专栏  ›  技术社区  ›  user7345804

字典项如何在父函数和子函数/子函数中用作函数kwargs?

  •  0
  • user7345804  · 技术社区  · 8 年前

    我正在编写一个代码,其中一些函数需要许多输入变量。因此,我认为通过字典使这些输入变量可调用kwargs是一个好主意。我对父函数调用的函数kwargs有问题。作为一个简单的示例,考虑下面的代码。

    import numpy as np
    
    ## generate some data and call function via dict
    
    def f(x):
        return np.cos(x)
    
    data_one = np.linspace(1, 10, 10) # x
    data_two = f(data_one) # y
    
    xy_dict = dict(x=data_one, y=data_two) ## put x,y into dict
    
    def try_dict_ops(x, y):
        c = [x[i] - y[i] for i in range(len(x)) if len(x) == len(y)]
        return np.array(c)
    
    print(try_dict_ops(**xy_dict)) 
    ## prints array, it works
    

    abxy_dict = dict(a=1, b=4, x=data_one, y=data_two)
    
    def try_nested_dict_ops(a, b, x, y):
        g = [try_dict_ops(x, y)[i] * a + b for i in range(len(x))]
        return np.array(g)
    
    print(try_nested_dict_ops(**abxy_dict))
    ## prints array, it works 
    

    我的问题是关于调用父函数的不同方法,父函数反过来调用上面定义的子函数。有没有更简单的方法来做到这一点,而不显式地 x y 在里面 abxy_dict ? 此外,如果父函数调用两个不同的子函数,它们共享kwargs名称,但不一定是args值,那么在这种设置下,我的目标是否仍然可行?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Martijn Pieters    8 年前

    使用字典传递关键字参数只是调用函数的不同拼写。没关系 函数本身 它是如何被调用的,它会以某种方式得到这些论点。

    换句话说,功能 如果您使用

    xy_dict = dict(x=data_one, y=data_two)
    try_dict_ops(**xy_dict)
    

    try_dict_ops(x=data_one, y=data_two)
    

    try_dict_ops(data_one, data_two)
    

    x y (所以传入它们的唯一目的是将它们传递给可传递函数调用),然后只需在 **kwargs 包罗万象:

    def try_nested_dict_ops(a, b, **kwargs):
        g = [try_dict_ops(**kwargs)[i] * a + b for i in range(len(x))]
        return np.array(g)
    

    关键字 传递给的参数 try_nested_dict_ops() 传递给 try_dict_ops() 调用,而函数本身不需要知道这些参数是什么。您可以将其用于多个函数调用。

    x y