嗨我有将动态参数传递给不同函数的问题。
例如:
假设我有7个变量(arg1,arg2,arg3,arg4,arg5,arg6,arg7)都是计算变量。
现在,我只需要将arg1,arg2,arg3变量传递给method1,arg1,arg4,arg5传递给method2等。
我需要动态地执行此操作。
就像在方法和变量之间使用mapper函数一样,它可以接受。通过选择方法,我需要获得它可以接受的变量,并只将那些变量传递给函数
def method1(arg1,arg2,arg3):
pass
def method2(arg1,arg4,arg5):
pass
def method3(arg1,arg2,arg4,arg6)
pass
如何实现这个????
答案 0 :(得分:0)
命名参数可能是您正在寻找的解决方案,因为您可以将命名值的字典传递给每个方法调用。例如:
# named arguments
args = {
'arg1': 'One',
'arg2': 'Two',
'arg3': 'Three',
'arg4': 'Four',
'arg5': 'Five',
'arg6': 'Six',
'arg7': 'Seven'
}
# explicitly name the parameters, good for readability
def method1(arg1=None,arg2=None,arg3=None, **kwargs):
print("arg1 %s arg2 %s arg3 %s" % (arg1, arg2, arg3))
# explicitly name the parameters, good for readability
def method2(arg1=None,arg4=None,arg5=None, **kwargs):
print("arg1 %s arg4 %s arg5 %s" % (arg1, arg4, arg5))
# no named parameters, check the kwargs dict for each required argument
def method3(**kwargs):
arg1 = kwargs.get('arg1')
arg2 = kwargs.get('arg2')
arg4 = kwargs.get('arg4')
arg6 = kwargs.get('arg6')
print("arg1 %s arg2 %s arg4 %s arg6 %s" % (arg1, arg2, arg4, arg6))
method1(**args)
method2(**args)
method3(**args)
运行该代码会产生以下输出:
arg1 One arg2 Two arg3 Three
arg1 One arg4 Four arg5 Five
arg1 One arg2 Two arg4 Four arg6 Six
答案 1 :(得分:0)
以下是如何将方法映射到参数的一个非常基本的示例。它假设args
是dict
,它是call
的缩影。您可能需要将args
作为参数传递给call
。
method_mapper = {
method1: ('arg1', 'arg2', 'arg3'),
method2: ('arg1', 'arg4', 'arg5'),
method3: ('arg1', 'arg2', 'arg4', 'arg6')
}
def call(method):
arg_names = method_mapper.get(method)
if arg_names: # we have args
print("method is %s" % (method.__name__))
print(" argument names are %s ; where" % (arg_names,))
for name in arg_names:
print (" %s = %s" % (name, args.get(name)))
call(method1)
答案 2 :(得分:0)
我也尝试过另一种方法。如果我在这种方法中错了,请纠正我
在一个类中,我在init中拥有它的所有变量。您可以计算或更改变量。然后获取方法名称后,我将调用包装器以获取需要传递给方法的变量,然后使用变量调用方法
class Class1():
def __init__(self):
self.arg1 = 0
self.arg2 = 0
self.arg3 = 0
self.arg4 = 0
self.arg5 = 0
def compute(self):
self.arg1 =1
self.arg4 = 1
method_name = "cars"
method_to_call = getattr(Class1(),method_name)
method_variables = method_to_variables_mapper(method_name)
result = method_to_call(method_variables )
print result
def method_to_variables_mapper(method_type):
mapper = {
"method1" : [{"arg1_name" : self.arg1} , {"arg2_name" :
self.arg2}]
"method2" : [{"arg3_name" : self.arg3}],
"method3" : [{"arg1_name" : self.arg1}, {"arg3_name" :
self.arg3}]
}
return mapper[method_type]
def cars(self, *args)
return 1
def bikes(self,*args)
return 2