Я пытаюсь написать оболочку для API формулы statsmodels (это упрощенная версия, функция делает больше):
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
описываетeval_env
kwd в **kwarg, который можно увеличить на 1.from_formula
наследуется всеми или большинством моделей. - person Josef   schedule 22.04.2016statsmodels.basedata.ModelData.__setstate__
, который пытается воссоздать формулу и дизайн во время распаковки. Я написал это методом проб и ошибок, основываясь на нескольких примерах. - person Josef   schedule 22.04.2016eval_env = 2
и 2.) это ключевое слово дляlogit(..)
, а не дляfit(...)
. (Не то, чтобы вы имели в виду, что это было, но я этого не осознавал). - person chriswhite   schedule 22.04.2016smf.logit
— это псевдонимsm.Logit.from_formula
, поэтому я имел в видуfrom_formula
. - person Josef   schedule 23.04.2016eval_env
было не для методаfit
, а для начального вызова формулы (будь то через API или нет). - person chriswhite   schedule 23.04.2016