我有一个自定义函数,它接受一组参数,使用所述参数的不同配置多次调用。清洁卫生署;易用性我想在所有函数调用之前定义一组参数,然后将这些函数调用作为**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:尝试解决更基本的问题: 对于一个有很多参数的函数,其中一些是变量或变量的修改,有什么方法可以传递相对整洁、可读且易于修改的参数?特别是如果使用我希望能够在代码中的同一位置配置的不同参数集多次调用
将显式关键字参数与解包混合使用。从
dict3
中删除'opt_arg6'
,只需执行以下操作:除此之外,最接近您尝试执行的操作是定义一个生成所需
dict
的函数,并在需要dict
时调用它。这根本不会提高性能(因为每次仍然会重新生成dict
),但可以想象,它会稍微简化调用代码。匹配第二个代码示例的示例将c_args
的定义替换为:如果函数位于同一作用域中,并且可以从其自身的外部作用域访问
c
和i
,则可以避免接受和传递c
和i
类似的方法是为
compile_func
编写一个包装器,完成必要的c
工作,从传递给所有相关显式关键字参数的显式c
扩展到compile_func
。在所有情况下,你都必须做同样的工作;如果不延迟dict
的创建直到惰性值实际可用,就不可能按照您希望的方式使用具有惰性计算值的dict
相关问题 更多 >
编程相关推荐