首页 文章

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

提问于
浏览
2

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

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

我一直在考虑使用函数来实现这一目标的最佳方法,这些函数可以被任何函数 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 回答

  • 1

    你写

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

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

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

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

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

  • 5

    你正在使用传递 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")
    

    您应该添加一个解释用法的文档字符串 .

相关问题