从配置文件中获取Python函数名
我有一个JSON配置文件,它告诉我应该从哪种分布中抽样。例如:
{ "parameter1" : { "distribution" : "exponential", "mean" = 5},
"parameter2" : { "distribution" : "poisson", "mean" = 3} }
上面的列表可能会很长。我需要一个函数来读取这个JSON文件,并返回合适的分布给调用它的代码。
我试过使用字符串拼接和eval()
,但这样直接给我的是样本值。我应该能够返回一个对象或函数给调用的函数。
有人能帮我实现这个吗?
我的尝试:
import numpy.random as random
def getDistribution(distribution, params):
string= 'random.'+distribution
return eval(string)(params["mean"])
这个尝试给我返回了一个值。有没有办法返回一个实际分布函数的引用,比如random.exponential()
或random.poisson()
,这样我就可以在调用getDistribution()
的函数中使用它?
1 个回答
3
你可以用 getattr
来获取一个方法,这个方法其实是 random
的一个属性。
def get_method(name):
return getattr(random, name, None)
def get_distribution(method, params):
return method(params['mean'])
method_name = 'exponential'
method = get_method(method_name)
if method:
results = get_distribution(method, params)
else:
raise AttributeError('No such method in random: {}'.format(method_name))
getattr
还可以接受一个可选的第三个参数,这个参数是在找不到属性时返回的值。我这里用的是 None
,表示什么都不返回。你也可以把这个值换成你想要的默认方法,这样如果你指定的方法名不存在,就会用这个默认方法。