Python如何从包含参数的字符串调用类方法

Python如何从包含参数的字符串调用类方法,python,eval,Python,Eval,我有以下代码。计算命令变量及其包含的参数的最佳方法是什么 这是一个人为的例子,但最简单的方式来解释我试图在更大范围内做什么 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

我有以下代码。计算命令变量及其包含的参数的最佳方法是什么

这是一个人为的例子,但最简单的方式来解释我试图在更大范围内做什么

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)")
您可以像这样使用eval函数:

def runself,命令: 返回evalcommand 这对您有用吗?

您可以这样使用eval功能:

def runself,命令: 返回evalcommand
<>这对你有用吗?

一般来说,这似乎是个坏主意,考虑重构你的代码。也就是说,您可以使用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)")

显然,你需要添加一些错误管理字符串,函数不存在,浮动而不是整数——你知道了。

一般来说,这似乎是个坏主意,考虑重构你的代码。也就是说,您可以使用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)")

显然,您需要添加一些错误管理-不存在的断字符串、函数、浮点而不是整数-您明白了。

不,我有一个错误,说随机数不是作业对象的成员@Bhavye Mathur说的对我有效,没有错误。但评估的安全性可能会降低潜在风险problem@kaktus_car谢谢你的警告,安全总比抱歉好,所以我在运行命令之前先检查一下命令。@prestontocks不客气,我同意,特别是当你在评估用户输入时,我没有发现错误,说random_number不是Job object的成员@Bhavye Mathur说的对我有用,没有错。但评估的安全性可能会降低潜在风险problem@kaktus_car谢谢你的警告,安全总比抱歉好,所以我在运行命令之前先检查一下命令。@prestontocks不客气,我同意,特别是如果你在评估用户输入谢谢,我要找的是regex。这将对我帮助很大,我正在积极地重新设计代码,但我只需要这一点来克服最初的障碍。谢谢你,我正在寻找的就是regex。这将对我帮助很大,我正在积极地重新设计代码,但我只需要这一点来克服最初的障碍。