Python 如何从包含参数的字符串调用 class 方法
Python how to call a class method from a string that contains parameters
我有以下代码。评估命令变量及其包含的参数的最佳方法是什么。
这是一个人为的例子,但却是解释我在更大范围内尝试做的事情的最简单方法。
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 run(self, command):
return eval(command)
这对你有用吗?
一般来说,这似乎不是个好主意,请考虑重构您的代码。也就是说,您可以结合使用 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)")
显然,您需要添加一些错误管理(损坏的字符串、不存在的函数、浮点数而不是整数 - 您明白了)。
我有以下代码。评估命令变量及其包含的参数的最佳方法是什么。
这是一个人为的例子,但却是解释我在更大范围内尝试做的事情的最简单方法。
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 run(self, command):
return eval(command)
这对你有用吗?
一般来说,这似乎不是个好主意,请考虑重构您的代码。也就是说,您可以结合使用 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)")
显然,您需要添加一些错误管理(损坏的字符串、不存在的函数、浮点数而不是整数 - 您明白了)。