Python使用**KWARG字典,包括赋值前的变量?

2024-10-06 11:17:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个自定义函数,它接受一组参数,使用所述参数的不同配置多次调用。清洁卫生署;易用性我想在所有函数调用之前定义一组参数,然后将这些函数调用作为**kwargs传递给每个调用:

def func(arg1, arg2, arg3, opt_arg4=x, opt_arg5=y, opt_arg6=z):
    do_something

dict1 = {'arg1': 'foo', 'arg2': 'bar', 'arg3': 'baz', 'opt_arg4': 42}
dict2 = {'arg1': 'Ni', 'arg2': 'Peng', 'arg3': 'Neee-Wom', 'opt_arg5': 'yellow'}
dict3 = {'arg1': 'Ni', 'arg2': 'bar', 'arg3': 'Ekke ekke', 'opt_arg6': name}

func(**dict1)
func(**dict2)
func(**dict3)

如果我希望字典中的一些参数是尚未定义的变量,我的问题就会出现。所以它们会在赋值之前被引用,除非它们只是占位符,在实际使用之前会被定义。例如,上面的dict3包含'opt_arg6': name,其中name是一个变量,它的用法如下:

knightlist = ['Lancelot', 'Galahad', 'Robin']
for name in knightlist:
    func(**dict3)

有没有办法做到这一点或达到类似的结果

编辑: 更详细一点,摘自实际代码:

i = 1
for c in c_list: # Where c_list has been read in from input
    compile_func(somedict[c], c, i, {'model': f'_{c}', 'optparm': '_i'}, log=logfile, subdir=c)
# Where somedict and logfile have previously been defined

我希望能够将其替换为:

c_args = {'arg1': somedict[c], 'arg2': c, 'arg3': i, 'arg4': {'model': f'_{c}', 'optparm': '_i'}, 'log': logfile, 'subdir': c}
# With the actual arg names as keys of course

Bunch_of_other_code()

i=1
for c in c_list:
    compile_func(**c_args)

或者类似可分离的东西。希望这更清楚

编辑2:尝试解决更基本的问题: 对于一个有很多参数的函数,其中一些是变量或变量的修改,有什么方法可以传递相对整洁、可读且易于修改的参数?特别是如果使用我希望能够在代码中的同一位置配置的不同参数集多次调用


Tags: nameinfor参数定义arg3listfunc
1条回答
网友
1楼 · 发布于 2024-10-06 11:17:52

将显式关键字参数与解包混合使用。从dict3中删除'opt_arg6',只需执行以下操作:

for name in knightlist:
    func(opt_arg6=name, **dict3)

除此之外,最接近您尝试执行的操作是定义一个生成所需dict的函数,并在需要dict时调用它。这根本不会提高性能(因为每次仍然会重新生成dict),但可以想象,它会稍微简化调用代码。匹配第二个代码示例的示例将c_args的定义替换为:

def make_c_args(c, i):
    return {'arg1': somedict[c], 'arg2': c, 'arg3': i, 'arg4': {'model': f'_{c}', 'optparm': '_i'}, 'log': logfile, 'subdir': c}


Bunch_of_other_code()

i=1
for c in c_list:
    compile_func(**make_c_args(c, i))

如果函数位于同一作用域中,并且可以从其自身的外部作用域访问ci,则可以避免接受和传递ci

类似的方法是为compile_func编写一个包装器,完成必要的c工作,从传递给所有相关显式关键字参数的显式c扩展到compile_func。在所有情况下,你都必须做同样的工作;如果不延迟dict的创建直到惰性值实际可用,就不可能按照您希望的方式使用具有惰性计算值的dict

相关问题 更多 >