0

私はPython を使用して Web サイトを作成していますcherrypymako

HTML ファイルの 1 つに、次の Lambda 関数があります。

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

object.listing文字列を含むリストはどこにありますか。

実行すると、前述のエラーが発生します:「未定義」オブジェクトは呼び出し可能ではありません。を削除すると、エラーは発生しませんsomeFunction()。だから私はそれがまたはであることと関係があると思いますが、curこれを防ぐ方法がわかりません.NoneUndefined

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
4

3 に答える 3

0

そこに置かれた関数を参照していますかsomeFunction()、それとも特定の関数を参照していますか? 後者の場合、そのコードを確認できますか? someFunction が eg に置き換えられた場合でも、コードはエラーになります(lambda x: x+x)(cur)か?

于 2012-12-27T16:44:20.997 に答える
0
'Undefined' object is not callable

存在しないものを呼び出そうとしていることを意味します。コールとは、関数を実行することを意味します。あなたが提供した情報から最も推測できるのは、someFunctionそれを使用しようとしている範囲内に実際には存在しないということです。

スタックトレースを見て、mako ではなく python 内で関数を定義したことを読んで、問題を理解していると思います。

http://docs.makotemplates.org/en/latest/syntax.html#defでは、テンプレート内で関数を定義する方法について説明しています。mako テンプレートから python ファイルにコールバックする方法はわかりませんが、これらの関数を mako 自体の中に書くことはできます。

于 2012-12-26T13:43:14.613 に答える
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(システム識別子) を変数名として使用することはお勧めできません。

于 2012-12-26T13:55:22.560 に答える