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

cha*_*ase 2 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)
Run Code Online (Sandbox Code Playgroud)

但输出是:

     a  b
val  1  2
min  0  1
max  2  3
{'a': 1, 'b': 2}
{}
{}
{}
{}
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*ory 5

你写

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

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

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

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

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