下面的代码可以使用与输入相同的数据,但是我需要使用** _以避免过多的参数。是否可以删除参数** _并向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)
[您尝试破解此方法以保存代码行的任何方法,都将不可读,并且会导致在db
中的数据格式错误时难以跟踪的错误。
以explicit, not implicit的方式正确执行。像这样调用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
)作为参数,并在内部进行解析(但这可能过于重复)
如果您尝试分别传递每个密钥,则应该没有问题,即:
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
祝你好运!
也许有一个装饰器捕获了错误的论点?
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