PonyORM 0.4.8引发NameError:未定义名称xx

时间:2014-01-21 03:41:50

标签: python nameerror ponyorm

我的程序遇到了一个奇怪的问题,异常堆栈是:

*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。

  • Python-2.7.4
  • 小马-0.4.8

2 个答案:

答案 0 :(得分:5)

Pony ORM作者在这里。乐高Stormtroopr已经回答了如何解决问题的问题,但是既然你也想知道这个bug的原因,我会在这里描述一下。您可以订阅我们的mailing list并在那里询问任何与Pony相关的问题。

简短回答:在0.4.8版本中,我们改进了@cut_traceback装饰器,这一改变打破了一些不相关的功能。

详细答案:

  1. 为了访问查询参数值(例如代码中的date_after),Pony会检查相应的堆栈框架。
  2. 每个Pony函数都是用@cut_traceback装饰器包装的公共API的一部分。当Pony用于交互模式时,此装饰器会切断一些内部回溯线。之前有些用户报告说,回溯输出对他们来说过于恐吓,而@cut_traceback使回溯输出更加“用户友好”。
  3. 在Pony @cut_traceback的先前版本中,装饰者有一个缺点 - 它隐藏了函数的真实参数,并将其替换为*args**kwargs。如果IDE向开发人员显示功能签名,这可能会很烦人。因此,我们用改进的版本替换了@cut_traceback装饰器,这使得装饰函数的签名保持不变。
  4. 但是这个新版本的@cut_traceback装饰器再使用一个堆栈帧。因此,应该修改从堆栈帧中获取用户参数的所有Pony函数,以便检查另一个堆栈帧。但我们忘了在0.4.8版本中这样做。
  5. 在版本0.4.9中,我们修复了所有检查堆栈帧的功能,并通过测试覆盖了此功能。
  6. 希望我回答你的问题:)

答案 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版本,它应该会消失。