我希望能有一个很好的方法让任何函数的传递参数都很容易 . 我正在制作大量的函数,每个函数都有很多变量 . 每个函数调用它们下面的许多函数,它们使用一些相同的参数 .
我已经决定我可以创建一个包含这些函数的默认参数的结构,然后用户可以将它们设置为一个值,它们决定或允许在执行拟合过程时变化 - 但是,给出了一个默认值每个参数的前期 .
我一直在考虑使用函数来实现这一目标的最佳方法,这些函数可以被任何函数 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 回答
你写
有技术解决方案,但这通常表明存在一些设计缺陷 .
例如,如果你有相互调用的函数,一遍又一遍地传递相同数量的参数,那么也许它们应该是类的方法,并且大多数参数应该是成员 . 这将增加封装以及减少传递的参数数量(参数隐含在
self
中) .否则,您可以考虑将参数本身设置为OO层次结构 . 也许您可能需要一些描述参数的类;也许它需要被分类,等等 .
恕我直言,你不应该用技巧来解决这个问题 .
你正在使用传递
a
和b
这是第一个argsa=default_a, b=default_b
所以你没有传递kwargs,除非你传递不同的名字你不会看到kwargs的任何输出:如果您想要默认值,请检查a和b是否作为kwargs传递,如果未传入值,则将值设置为某个默认值:
您应该添加一个解释用法的文档字符串 .