【问题标题】:Reduce Lambda error: 'Undefined' object is not callable减少 Lambda 错误:“未定义”对象不可调用
【发布时间】:2012-12-26 13:39:00
【问题描述】:

我正在使用 cherrypy 和 mako 和 Python 来创建网站。

在我的一个 HTML 文件中,我有以下 Lambda 函数:

${reduce(lambda list, cur : '<li>' + someFunction(cur) + '</li>' + 
                             list, object.listing, '')}

object.listing 是一个带有字符串的列表。

执行导致上述错误:“未定义”对象不可调用。如果我删除someFunction(),则不会发生错误。所以我认为这与cur 是None 或Undefined 有关,但我不知道如何防止这种情况。

我什至不太确定 reduce 函数是如何工作的。

整个堆栈跟踪,根据要求:

[26/Dec/2012:13:15:22] HTTP 
Request Headers:
  REFERER: http://localhost:8080/list
  HOST: localhost:8080
  CONNECTION: keep-alive
  Remote-Addr: 127.0.0.1
  ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  USER-AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0
  COOKIE: session_id=960e569568ded77610f11c48bec0a806f5a4501b
  ACCEPT-LANGUAGE: en-US,en;q=0.5
  DNT: 1
  ACCEPT-ENCODING: gzip, deflate
[26/Dec/2012:13:15:22] HTTP Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cprequest.py", line 656, in respond
    response.body = self.handler()
  File "/Library/Python/2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/lib/encoding.py", line 188, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/CherryPy-3.2.2-py2.7.egg/cherrypy/_cpdispatch.py", line 34, in __call__
    return self.callable(*self.args, **self.kwargs)
  File "/Volumes/Ritalin/Projects/splitpot/controller/Splitpot.py", line 54, in event
    return tmpl.render(object=doSomething())
  File "/Library/Python/2.7/site-packages/mako/template.py", line 412, in render
    return runtime._render(self, self.callable_, args, data)
  File "/Library/Python/2.7/site-packages/mako/runtime.py", line 766, in _render
    **_kwargs_for_callable(callable_, data))
  File "/Library/Python/2.7/site-packages/mako/runtime.py", line 798, in _render_context
    _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
  File "/Library/Python/2.7/site-packages/mako/runtime.py", line 824, in _exec_template
    callable_(context, *args, **kwargs)
  File "base_html", line 31, in render_body
  File "someFile_html", line 58, in render_body
  File "someFile_html", line 58, in <lambda>
TypeError: 'Undefined' object is not callable

【问题讨论】:

  • 您应该使用堆栈跟踪显示整个错误,以便我们更容易诊断。
  • 向我们展示您的someFunction。在您的示例中,cur 是什么?

标签: python lambda undefined mako


【解决方案1】:

我不知道问题出在哪里(因此是 CW),只是想指出,在这里列表理解可能是比 reduce 更好的选择:

html = ''.join('<li>' + someFunction(x) + '</li>' for x in listing)

请注意,您的 reduce 代码实际上反转了一个列表,如果这是故意的,请将 reversed 添加到上面:

html = ''.join('<li>' + someFunction(x) + '</li>' for x in reversed(listing))

另外,使用list(系统标识符)作为变量名也不是一个好主意。

【讨论】:

    【解决方案2】:

    someFunction() 是指放在那里的任何函数,还是一个特定的函数?如果是后者,我们能看到那个代码吗?当 someFunction 被替换为 e.g. 时,代码是否仍然出错(lambda x: x+x)(cur)?

    【讨论】:

      【解决方案3】:
      'Undefined' object is not callable
      

      表示您正在尝试调用不存在的东西。调用意味着执行一个函数。根据您提供的信息,最好的猜测是 someFunction 实际上并不存在于您尝试使用它的范围内。

      查看您的堆栈跟踪并阅读您在 python 而不是 mako 中定义了您的函数,我想我理解了这个问题。

      http://docs.makotemplates.org/en/latest/syntax.html#def 描述了如何在模板中定义函数。我不知道如何从 mako 模板回调 python 文件 - 但您可以在 mako 本身中编写这些函数。

      【讨论】:

      • 如何在模板中正确使用函数?如何导入 Python 类?
      • @cherrun someFunction 定义在哪里,它有什么作用?您是在 mako 模板中定义的,还是在 python 文件中定义的?
      • 在python文件中定义。该函数根据给定的值返回一个特定的字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-12-30
      • 2021-10-27
      • 2022-01-14
      • 2021-10-07
      • 2021-12-29
      相关资源
      最近更新 更多