我正在使用cherrypy
和mako
与Python一起创建网站。
在我的一个HTML文件中,我有以下Lambda函数:
${reduce(lambda list, cur : '<li>' + someFunction(cur) + '</li>' +
list, object.listing, '')}
object.listing
是一个包含字符串的列表。
在上述错误中执行结果:'Undefined'对象不可调用。如果我删除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
答案 0 :(得分:0)
'Undefined' object is not callable
意味着您正在尝试调用不存在的内容。调用意味着执行一个函数。最好猜测您提供的信息是someFunction
实际上并不存在于您尝试使用它的范围内。
查看你的堆栈跟踪并读取你已经在python而不是mako中定义了你的函数,我想我理解了这个问题。
http://docs.makotemplates.org/en/latest/syntax.html#def介绍了如何在模板中定义函数。我不知道从mako模板回调python文件的方法 - 但是你可以在mako中编写这些函数。
答案 1 :(得分:0)
我不知道问题是什么(因此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 :(得分:0)
someFunction()
是指任何放在那里的函数,还是一个特定的函数?如果是后者,我们可以看到那个代码吗?当someFunction被替换为例如,代码仍然是错误的(lambda x: x+x)(cur)
?