在由exec()执行的函数内部调用函数并获取结果

时间:2019-02-14 22:32:02

标签: python python-3.x

我正在尝试在python中开发远程过程调用框架,但是exec()函数存在问题。简化方案:

class Example:
  def __init__():
    pass

  def add(self, string):
    return anothermodule.func(self,string)


class Framework:

  def function_call():
     exec("a = exampleObject.add(string)")

用exec()调用函数似乎是不可能的,该函数里面有另一个函数。我已经尝试过,但是总是得到“错误的参数数量”。在调试模式下,我什至都不会转移到“添加”功能来查看正在发生的事情。

这正常工作。

class Example:
  def __init__():
    pass

  def add(self, x):
    return x + 3

class Framework:

  def function_call():
     exec("a = exampleObject.add(8)")


def main():
  framework = Framework()
  framework.function_call()

exampleObject是根据另一个方法中提供的参数在另一个类中动态创建的。这只是Example类的实例。这只是我要实现的简化版本。它不代表我的确切代码。我想说的是,我的exec()仅适用于简单的操作,并且无法以某种方式调用原始方法中的另一种方法。

编辑

class Calculator():
    def add(self,a,b):
        return a + b

    def testFunction(self,a,b):
        return self.add(self,a,b)


def main():
    # Create new client object, specifying redis server and channel
    remote_calculator = rpcpyredis.Proxy("localhost", "Calculator", port=6379)

    # Calling any method with client object
    result = remote_calculator.testFunction(3,4)


 if __name__== '__main__':
    main()


class Server:
    def execute_code(self, calling_function, class_type):
        object = class_type()
        final_function_call = 'self.result = object.' + calling_function
        exec(final_function_call)
        return self.result

  def make_function(self, request):
      args = request["params"]
      arguments = ",".join((str(i) for i in args))
      method_name = (request["function"])
      return '%s(%s)' % (method_name, arguments)

      def start():
          class_type = registry.lookup(object_to_lookup_for)
          calling_function = self.make_function(extracted_request)
          rpc_response = self.execute_code(calling_function, class_type)

1 个答案:

答案 0 :(得分:1)

从您的示例来看,我认为问题根本不在于您给exec()打电话。而是在testFunction方法中:

def testFunction(self,a,b):
    return self.add(self,a,b)

请注意,您在向self的呼叫中提供了self.add(self, a, b)self总是隐式包含在方法调用中,因此该行实际上是在调用self.add(self, self, a, b),实际上确实有错误数量的参数。

那应该可以解决您的错误。但是除此之外,您还应该never use exec()