Python как вызвать метод класса из строки, содержащей параметры - PullRequest
1 голос
/ 12 июля 2020

У меня есть следующий код. Как лучше всего оценить командную переменную и содержащиеся в ней параметры.

Это надуманный пример, но это самый простой способ объяснить, что я пытаюсь сделать в более крупном масштабе.

class Job():
  def random_number(self, start, end, prec=0):
    number = round(random.uniform(start,end),prec)
    if(prec == 0):
      return int(number)
    return number

  def run(self, command):
    #command = "self.random_number(1,10,0)"
    #**************
    # What would be the best way to 'eval' the content of the 'command' variable and the parameters it contains?
    #**************

job = Job()
job.run("self.random_number(1,10,0)")

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Как правило, это плохая идея, подумайте о реструктуризации кода. Тем не менее, вы можете использовать getattr(...) в сочетании с разделением вашей строки на функцию и часть параметров:

import random, re

class Job():
    def random_number(self, start, end, prec=0):
        number = round(random.uniform(start, end), prec)
        if (prec == 0):
            return int(number)
        return number

    def run(self, command):
        fun, params, _ = re.split(r'[()]', command)
        params = map(int, params.split(","))

        func = getattr(Job, fun)
        print(func(*params))

job = Job()
job.run("random_number(1,10,0)")

Очевидно, вам нужно будет добавить некоторое управление ошибками (сломанные строки, функции , которых не существует, вместо целых чисел с плавающей точкой - вы поняли).

0 голосов
/ 12 июля 2020

Вы можете использовать функцию eval() так:

 def run(self, command):
    return eval(command)

сработает ли это для вас?

...