python关键字参数过多

问题描述 投票:0回答:3

下面的代码可以使用与输入相同的数据,但是我需要使用** _以避免过多的参数。是否可以删除参数** _并向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)
python arguments
3个回答
1
投票

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

explicit, not implicit的方式正确执行。像这样调用f1f2

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)

所有功能的另一种选择是将两个函数都接受完整的dbdict)作为参数,并在内部进行解析(但这可能过于重复)


0
投票

如果您尝试分别传递每个密钥,则应该没有问题,即:

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

祝你好运!


0
投票

也许有一个装饰器捕获了错误的论点?

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
© www.soinside.com 2019 - 2024. All rights reserved.