Python: динамическая инициализация членов класса из строк, содержащих выражения - PullRequest
0 голосов
/ 28 июня 2019

Это довольно общий сценарий, но, чтобы дать некоторый контекст, допустим, я использую cvxpy , чтобы выполнить некоторую ограниченную оптимизацию. Теперь скажите, что я хочу предоставить целевую функцию во время выполнения, например, func ниже:

import cvxpy as cp

class foo:
  def __init__(self,n,q,s):
    self.n,self.q,self.s=n,q,s
    self.K = len(n)
    self.x = cp.Variable(self.K)
    self.func = cp.sum(sum(self.n[j]*sum(self.n[i]*self.x[j] for i in range(self.K)) for j in range(self.K))

Конечно, функция в этом примере является надуманной, просто чтобы дать вам пример какой строкового выражения, которое я готов предоставить в качестве параметра командной строки, просто чтобы избежать жесткого кодирования / постоянного изменения исходного кода. Как я могу переопределить значение этого func члена новым, во время выполнения? Я прочитал о exec, но я не уверен, поможет ли это. Короче говоря, я готов сделать что-то вроде python my_awesom_prog.py "self.n[i]*self.n[j] for i in range(self.K) for range(self.K)" и хотел бы, чтобы программа вела себя так, как если бы эта (ужасная) строка была там как определение func. РЕДАКТИРОВАТЬ: ближе к делу, я хотел бы иметь такой метод:

def reset_objective(mystring):
   self.func = interpret_as_cvxpy_entity(mystring)

Теперь, как получить этот interpret_as_cvxpy_entity API?

1 Ответ

0 голосов
/ 29 июня 2019

Вы можете использовать input() и eval(). Итак, что-то вроде:

import cvxpy as cp

class foo:
  def __init__(self,n,q,s):
    self.n,self.q,self.s=n,q,s
    self.K = len(n)
    self.x = cp.Variable(self.K)
    self.func = eval(input())

Затем вы можете запустить свой скрипт как python my_awesom_prog.py и "self.n[i]*self.n[j] for i in range(self.K) for range(self.K)" в качестве ввода.

Я должен предупредить вас об опасности eval(input()). Например, вы можете ввести код в функцию eval, которая удаляет каждый файл на вашем компьютере. Для получения дополнительной информации о том, почему вы не должны этого делать, я отсылаю вас к следующей статье:

https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...