Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python关键字参数太多_Python_Arguments - Fatal编程技术网

python关键字参数太多

python关键字参数太多,python,arguments,Python,Arguments,下面的代码可以使用相同的数据作为输入,但我需要使用**来避免太多的参数。 是否有删除参数**并将正确参数输入f1和f2的方法 def f1(freq,bw,**_): print(freq,bw) def f2(FW_ID,**_): print(FW_ID) db = { 'freq':2414, 'bw':20, 'FW_ID':0.1, } f1(**db) f2(**db) 如果您尝试单独传递每个密钥,则不会出现问题,即: def f1

下面的代码可以使用相同的数据作为输入,但我需要使用**来避免太多的参数。 是否有删除参数**并将正确参数输入f1和f2的方法

def f1(freq,bw,**_):
    print(freq,bw)
def f2(FW_ID,**_):
    print(FW_ID)
db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
    }

f1(**db)
f2(**db)

如果您尝试单独传递每个密钥,则不会出现问题,即:

def f1(freq,bw):
    print(freq,bw)
def f2(FW_ID):
    print(FW_ID)
db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
    }

f1(db['freq'], db['bw'])

2414 20

f2(db['FW_ID'])

0.1

祝你好运

您尝试并破解此方法以保存代码行的任何方法都是不可读的,并且当
db
中的数据格式不正确时,都会导致难以跟踪的错误

用正确的方式去做。按如下方式调用
f1
f2

f1(freq=db['freq'], bw=db['bw'])
f2(FW_ID=db['FW_ID'])
甚至只是:

f1(db['freq'], db['bw'])
f2(db['FW_ID'])
如果这样做,则不需要使用
**
参数,并且可以编写更可读的函数签名:

def f1(freq,bw):
    print(freq,bw)

def f2(FW_ID):
    print(FW_ID)

另一种方法是让两个函数都接受完整的
db
dict
)作为参数,并在内部解析它(但这可能太重复了)

可能使用一个捕获错误参数的装饰器

import inspect

def catch_bad_args(func):
    def func_new(*args, **kwargs):
        argnames, _, _, _ = inspect.getargspec(func)
        kwargs = {k:v for k,v in kwargs.items() if k in argnames}
        return func(*args, **kwargs)

    return func_new

@catch_bad_args
def f1(freq, bw):
    print(freq, bw)

@catch_bad_args
def f2(FW_ID):
    print(FW_ID)

db = {
    'freq':2414,
    'bw':20,
    'FW_ID':0.1,
}

f1(**db)
f2(**db)
输出:

2414 20
0.1

为什么不分别传递各自的字段值呢?因为我在运行脚本f1(**db)、f2(**db)时,会将脚本读取到函数中,并组合成列表=(f1,db),(f2,db),(f3,db)…(f100,db)]等格式,但不幸的是,db是从脚本读取的一些变量,比如,freq=2412,bw=20…等等,但有一些变量没有从脚本读取(对于ex sys_path,log_path),这将在db中创建一些不必要的参数,因此我必须使用**来捕获在实际情况下,我希望许多有趣的人可以使用相同的输入将非常简单使用f1(db['freq',db['bw'])将工作,但效率较低,如果我有F1~F100I需要处理这100个差异,我知道你的意思,但使用装饰几乎就像我添加**和将降低性能…我认为最好的方法是使用装饰器,但考虑到性能,我认为使用**是唯一的方式…@黃瀚嶙 decorator可能更具描述性。您可以加入
functools.wrapps
,用户在阅读函数文档时只能看到有效的参数。在实际情况下,我希望很多有趣的人可以使用相同的输入,因此使用f1(db['freq'],db['bw'])如果我有f1~f100,我需要处理这100个不同的情况-