0

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

*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上正常运行。

你能告诉我有什么问题吗?谢谢。

ps

  • Python-2.7.4
  • 小马-0.4.8
4

2 回答 2

5

Pony ORM 作者在这里。Lego Stormtroopr 已经回答了如何解决问题的问题,但是由于您也想知道错误的原因,所以我将在此处进行描述。您可以订阅我们的邮件列表并在那里提出任何与 Pony 相关的问题。

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

详细解答:

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

希望我回答了你的问题:)

于 2014-01-24T12:00:32.140 回答
2

您的 Pony 版本已过时。几个月前解决了 Pony 中有关 lamdbas 的一个已关闭错误,它是您的错误'"ExprEvalError" raises NameError: name is not defined' in Google的第一个(也是唯一一个)命中。

更新您的 Pony 版本,它应该会消失。

于 2014-01-21T03:48:36.617 回答