基于方法和参数之间的配置映射器将动态参数传递给方法

时间:2015-12-27 15:54:21

标签: python dynamic

嗨我有将动态参数传递给不同函数的问题。

例如:

假设我有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

如何实现这个????

3 个答案:

答案 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)

以下是如何将方法映射到参数的一个非常基本的示例。它假设argsdict,它是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