【发布时间】:2016-08-16 09:21:07
【问题描述】:
我正在尝试为 statsmodels 公式 API 编写一个包装器(这是一个简化的版本,功能不止于此):
import statsmodels.formula.api as smf
def wrapper(formula, data, **kwargs):
return smf.logit(formula, data).fit(**kwargs)
如果我将此功能提供给用户,然后他/她会尝试定义他/她自己的功能:
def square(x):
return x**2
model = wrapper('y ~ x + square(x)', data=df)
他们将收到NameError,因为patsy 模块正在wrapper 的命名空间中查找函数square。是否有一种安全的 Pythonic 方式来处理这种情况,而无需先验地知道函数名称是什么或需要多少函数?
仅供参考:这是针对 Python 3.4.3 的。
【问题讨论】:
-
我不知道细节(对我来说太神奇了),但
statsmodels.base.model.Model.from_formula文档字符串描述了 **kwarg 中的eval_envkwd,您可以将其增加 1。from_formula被所有或大多数模型继承。 -
是的,我确实尝试过;似乎没有用,但也许我没有正确调用它。
-
您是否尝试将其设置为 3?在类似的情况下,我使用 try..except 包装来确定用户函数的深度。
-
示例:
statsmodels.basedata.ModelData.__setstate__尝试在 unpickling 期间重新创建公式和设计。我是根据几个例子反复试验写的。 -
@user333700 将此作为答案发布,我会接受;两个注意事项:1.)我必须设置
eval_env = 2和 2.)这是logit(..)的关键字,而不是fit(...)。 (不是你暗示它是,但我没有意识到这一点)。
标签: python python-3.x namespaces statsmodels patsy