python关键字参数太多
下面的代码可以使用相同的数据作为输入,但我需要使用**来避免太多的参数。 是否有删除参数**并将正确参数输入f1和f2的方法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
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个不同的情况-