调用默认关键字参数的最佳方法

时间:2015-05-30 20:14:39

标签: python function

我希望有一个很好的方法让任何函数的传递参数都很容易。我正在制作大量的函数,每个函数都有很多变量。每个函数调用它们下面的许多函数,它们使用一些相同的参数。

我已经决定我可以创建一个包含这些函数的默认参数的结构,然后用户可以将它们设置为它们决定的值或允许在执行拟合程序时变化的值 - 但是,默认值每个参数都预先给出了值。

我一直在考虑使用函数f()执行此操作的最佳方法,该函数被调用以获取任意数量的相关参数;因此,f()将返回与f(default_param_structure)相同的值,因为默认值是假定的。此外,调用f(arg1=1, arg31='a')将替换相关参数。

以下是我想要解决的一个例子:

import pandas as pd
import numpy as np
default_a = 1
default_a_min = 0
default_a_max = 2
default_b = 2
default_b_min = 1
default_b_max = 3

def default_param_struct():
    a = np.array([default_a, default_a_min, default_a_max])
    b = np.array([default_b, default_b_min, default_b_max])
    d = {'a': a, 'b': b}
    return pd.DataFrame(d, index=['val', 'min','max'])

def f(a=default_a, b=default_b, *args, **kwargs):
    return kwargs

default_param_df = default_param_struct()
print default_param_df
def_param_dict = default_param_df.loc['val'].to_dict()
print def_param_dict


# This should print {'a': 3, 'b': 2}  (i.e. a is passed and default_b is given automatically)
print f({'a':3})
# This should print {'a': 1, 'b': 2}  (as this is the default parameter structure calculated in the function)
print f(def_param_dict)
# This should print {'a': 1, 'b': 2}  (default parameter structure is assumed)
print f()
# This should print {'a': 4, 'b': 2}  (i.e. a is passed and default_b is given automatically)
print f(a=4)
# This should print {'a': 3, 'b': 5}  as they are both passed
print f(a=3, b=5)

但输出是:

     a  b
val  1  2
min  0  1
max  2  3
{'a': 1, 'b': 2}
{}
{}
{}
{}

因此没有任何论据可以证明这一点。有谁知道如何解决这个问题?有更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:5)

你写

  

我正在制作大量的函数,每个函数都有很多变量。

对此有技术解决方案,但这通常表明存在一些设计缺陷。

,例如,如果你有相互调用的函数,反复传递相同数量的参数,那么也许它们应该是类的方法,并且大多数参数应该是成员。这既会增加封装,也会减少传递的参数数量(参数隐含在self中)。

否则,您可以考虑将参数本身设置为OO层次结构。也许您可能需要一些描述参数的类;也许它需要被子类化等等。

恕我直言,你不应该用技巧来解决这个问题。

答案 1 :(得分:1)

你正在使用传递ab这是第一个args a=default_a, b=default_b所以你没有传递任何kwargs,除非你传递不同的名字你不会看到kwargs的任何输出:

print f(f=3, j=5)
{'j': 5, 'f': 3}

如果你想要默认值,检查a和b是否作为kwargs传递,如果没有传入值,则将值设置为某个默认值:

def f(*args, **kwargs):
    a,b = kwargs.get("a","default_value"),kwargs.get("b","default_value")

您应该添加解释用法的文档字符串。