0

这是一个非常普遍的场景,但是为了给出一些上下文,假设我正在使用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_entityAPI?

4

1 回答 1

0

您可以使用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

于 2019-06-28T21:13:29.480 回答