【问题标题】:Passing dynamic arguments to methods based on config mapper between methods and arguments基于方法和参数之间的配置映射器将动态参数传递给方法
【发布时间】:2015-12-27 15:54:20
【问题描述】:

您好,我在将动态参数传递给不同的函数时遇到问题。

例如:

假设我有 7 个变量(arg1,arg2,arg3,arg4,arg5,arg6,arg7)都是计算变量。

现在,我只需将 arg1,arg2,arg3 变量传递给 method1 ,将 arg1,arg4,arg5 传递给 method2 等。

我需要动态地执行此操作。

就像在它可以接受的方法和变量之间有一个映射器函数一样。通过选择方法,我需要获取它可以接受的变量,并且只将这些变量传递给函数

def method1(arg1,arg2,arg3):
    pass

def method2(arg1,arg4,arg5):
    pass

def method3(arg1,arg2,arg4,arg6)
    pass

如何做到这一点????

【问题讨论】:

    标签: python dynamic


    【解决方案1】:

    命名参数可能是您正在寻找的解决方案,因为您可以将命名值的字典传递给每个方法调用。例如:

    # 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
    

    【讨论】:

    • 您好,感谢您的回复,这可能是解决问题的另一种观点,但我知道一些参数映射方法的配置或映射器。因为我将传递我想要调用的方法类型,所以映射器应该返回我的变量,然后我需要将这些变量(参数)单独传递给该方法..
    • 我已经添加了另一个答案,我将把这个留在这里,因为它可能对某人有用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我也尝试过另一种方法。如果我在这种方法上错了,请纠正我

      在一个类中,我在 init 本身中拥有它的所有变量。您可以计算或更改变量。然后得到方法名后,我会调用wrapper来获取需要传递给方法的变量,然后再用变量调用方法

      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
      

      【讨论】:

      • 该代码中有一些错误。您可以使用我的答案并对其进行修改,以内省地查找方法和参数值,就像您在上面尝试的 method_to_call 一样。
      猜你喜欢
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2011-07-23
      相关资源
      最近更新 更多