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

Python 调用默认关键字参数的最佳方法,python,function,Python,Function,我希望能找到一种好方法,使向任何函数传递参数变得容易。我制作了大量的函数,每个函数都有大量的变量。每个函数调用它们下面的许多函数,这些函数使用一些相同的参数 我已经决定,我可以创建一个包含这些函数的默认参数的结构,然后用户可以将它们设置为恒定的值,或者在执行拟合过程时允许其变化-但是,每个参数都会预先给出一个默认值 我一直在想用函数实现这一点的最佳方法,对于调用任何函数f()以获取任意数量的相关参数;因此f()将返回与假定默认值相同的f(默认参数结构)。此外,调用f(arg1=1,arg31='

我希望能找到一种好方法,使向任何函数传递参数变得容易。我制作了大量的函数,每个函数都有大量的变量。每个函数调用它们下面的许多函数,这些函数使用一些相同的参数

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

我一直在想用函数实现这一点的最佳方法,对于调用任何函数
f()
以获取任意数量的相关参数;因此
f()
将返回与假定默认值相同的
f(默认参数结构)
。此外,调用
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}
{}
{}
{}
{}

因此,没有一个论点是正确的。有人知道如何解决这个问题吗?有更优雅的解决方案吗?

您使用的是passing
a
b
这两个参数是第一个参数
a=default\u a,b=default\u 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")
您应该添加一个解释用法的docstring

你在写什么

我制作了大量的函数,每个函数都有大量的变量

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

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

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


IMHO,你不应该用技术技巧来解决这个问题。

谢谢你的评论,我做了一些这是面向对象的,但我试图从功能上做一些事情,因为这似乎是许多人看待未来的方式。我希望它对多处理器的可扩展性更强,因为据我有限的了解,OO不用于多处理器。@chase“OO不用于多处理器”根本不是真的。如果你想做函数式编程而不是面向对象编程,这是很公平的,但是Python并不是最好的编程语言;它具有一些功能特性,但主要是面向对象的。@ Chase,我保证OOP不会在任何时候都会发生,尤其是当您认为您的示例中几乎所有的变量都是某个对象的实例时。