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

Jue*_*Xie 0 python nameerror ponyorm

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

*except Exception, cause: raise ExprEvalError(src, cause)
ExprEvalError: date_after raises NameError: name 'date_after' is not defined*
Run Code Online (Sandbox Code Playgroud)

所以代码是:

    @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))[:])
Run Code Online (Sandbox Code Playgroud)

ORM框架是Pony,但我认为它与此无关.代码可以在其他PC上正常运行.

你能告诉我这是什么问题吗?谢谢.

PS

  • Python的2.7.4
  • 小马-0.4.8

Ale*_*sky 5

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

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

详细解答:

  1. 为了访问查询参数值(例如date_after在您的代码中),Pony检查相应的堆栈帧.
  2. 每个Pony函数都是用@cut_traceback装饰器包装的公共API的一部分.当Pony用于交互模式时,此装饰器会删除一些内部回溯线.之前一些用户报告说,回溯输出对他们来说过于恐吓,@cut_traceback并使回溯输出更"用户友好".
  3. 在小马的早期版本中@cut_traceback装饰有一个缺点-它隐藏功能的真正的争论,取而代之他们*args**kwargs.如果IDE向开发人员显示功能签名,这可能会很烦人.因此,我们用@cut_traceback改进的版本替换了装饰器,这使得装饰功能的签名保持完整.
  4. 但是这个新版本的@cut_traceback装饰器使用了一个堆栈帧.因此,应修改从堆栈帧中获取用户参数的所有Pony函数,以便检查另一个堆栈帧.但我们忘了在0.4.8版本中这样做
  5. 在版本0.4.9中,我们修复了所有检查堆栈帧的功能,并通过测试覆盖了此功能.

希望我回答你的问题:)