我正在尝试编写一个通用函数,它接受一个用户定义的函数,一个先验列表(除了其他东西)和做某事(与这个问题无关)
for eg(...在以下代码片段中引用无关信息)
generic_func(..., pred, [pymc.Uniform("a", 0, 5), pymc.Unform("b", 0, 1)], ...)
其中user_fn定义为
def pred(...,a, b, ...) : ...
我需要定义generic_func,我按如下方式进行:
def generic_func(..., user_fn, fittable_prior_list, optional_arguments_for_user_fn):
h = {}
for params in fittable_prior_list:
h[params.name] = params
user_fn(..., **h, ...)
我不想限制用户以与user_fn期望的顺序相同的顺序传递参数,这就是我使用字典的原因。我假设列表中的先验将与user_fn的参数具有相同的名称(我很乐意知道这个假设是否可以废除,但即使这个假设成立也没关系)
但是我收到以下错误:
AttributeError: 'Uniform' object has no attribute 'name'
我使用了这些链接How can I read a function's signature including default argument values?,还有Getting method parameter names in python
然后我试了
tau = pm.Uniform(name = "tau", lower=0, upper=5)
argspec = inspect.getargspec(tau).args
我收到以下错误
TypeError: <pymc.distributions.Uniform 'tau' at 0x9a3210c> is not a Python function
有没有办法可以访问这些pymc对象的名称?
虽然这不是主要问题,但我也很高兴知道有没有比我正在使用的方法更好的方法来解决这个问题。
答案 0 :(得分:0)
有问题的对象将其名称存储在__name__
属性中。可以像这样访问它们:
import pymc
obj = pymc.Uniform("a", 0, 5)
print obj.__name__