我的程序遇到了一个奇怪的问题,异常堆栈是:
*except Exception, cause: raise ExprEvalError(src, cause)
ExprEvalError: date_after raises NameError: name 'date_after' is not defined*
所以代码是:
@staticmethod
def get_recently(days_before=30):
delta = timedelta(days=days_before)
date_after = datetime.now() - delta
return list(Version.select(lambda v:v.create_time>date_after).order_by(desc(Version.create_time))[:])
ORM框架是Pony,但我认为它与此无关。代码可以在其他PC上正常运行。
你能告诉我这是什么问题吗? 感谢。
P.S。
答案 0 :(得分:5)
Pony ORM作者在这里。乐高Stormtroopr已经回答了如何解决问题的问题,但是既然你也想知道这个bug的原因,我会在这里描述一下。您可以订阅我们的mailing list并在那里询问任何与Pony相关的问题。
简短回答:在0.4.8版本中,我们改进了@cut_traceback
装饰器,这一改变打破了一些不相关的功能。
详细答案:
date_after
),Pony会检查相应的堆栈框架。@cut_traceback
装饰器包装的公共API的一部分。当Pony用于交互模式时,此装饰器会切断一些内部回溯线。之前有些用户报告说,回溯输出对他们来说过于恐吓,而@cut_traceback
使回溯输出更加“用户友好”。@cut_traceback
的先前版本中,装饰者有一个缺点 - 它隐藏了函数的真实参数,并将其替换为*args
和**kwargs
。如果IDE向开发人员显示功能签名,这可能会很烦人。因此,我们用改进的版本替换了@cut_traceback
装饰器,这使得装饰函数的签名保持不变。@cut_traceback
装饰器再使用一个堆栈帧。因此,应该修改从堆栈帧中获取用户参数的所有Pony函数,以便检查另一个堆栈帧。但我们忘了在0.4.8版本中这样做。希望我回答你的问题:)
答案 1 :(得分:2)
您的Pony版本已过期。 There is a closed bug regarding lamdbas in Pony that was resolved months ago,这是您的错误'"ExprEvalError" raises NameError: name is not defined' in Google的第一个(也是唯一的)匹配。
更新您的Pony版本,它应该会消失。