从配置文件中获取Python函数名

1 投票
1 回答
2154 浏览
提问于 2025-04-18 09:14

我有一个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,表示什么都不返回。你也可以把这个值换成你想要的默认方法,这样如果你指定的方法名不存在,就会用这个默认方法。

撰写回答