5

私は持っています

<%!
    from __future__ import division
%>

テンプレートファイルの一番上にあります。エラーが発生します:

SyntaxError: from __future__ imports must occur at the beginning of the file 

これを行う正しい方法は何ですか?

4

2 に答える 2

4

from __future__ importMakoテンプレートでステートメントを使用することはできません。まったく。

これは、MakoテンプレートがPythonファイルにコンパイルされており、これが機能するために、そのPythonファイルの先頭にいくつかの初期構造が設定されているためです。

# -*- encoding:ascii -*-
from mako import runtime, filters, cache
UNDEFINED = runtime.UNDEFINED
__M_dict_builtin = dict
__M_locals_builtin = locals
_magic_number = 7
_modified_time = 1348257499.1626351
_template_filename = '/tmp/mako.txt'
_template_uri = '/tmp/mako.txt'
_source_encoding = 'ascii'
_exports = []

この初期設定の後でのみ、テンプレート自体からのコードが含まれます。あなたfrom __future__ import divisionが最初に配置されることはありません。

/除算演算子のいずれかのオペランドをfloatにキャストすることにより、浮動小数点除算を引き続き使用できます。

>>> 1 / 2
0
>>> float(1) / 2
0.5

その回避策に従う限り、division将来のインポートなしで問題なく実行できます。

于 2012-09-21T20:03:28.107 に答える
0

からのインポートは__future__きちんとしていますが、それを機能させる方法が考えられません(たぶん、マコの内部に精通している人ができます)Martijnはそれが不可能な理由を説明します。ただし、いくつかの回避策を提案できます。

可能であれば、テンプレートの外側で除算を行い、結果をコンテキストに入れます。これは、できるだけ多くのロジックをテンプレートから除外するという私の個人的な好みと一致しています。

それが選択肢ではない場合は、ハッキーな解決策があります。オペランドを浮動小数点数に変換してください。さまざまな場所でこの分割を行う必要がある場合は、モジュールレベルのブロックに関数を追加できます。

<%!
    def div(a, b):
        return float(a) / float(b)
%>

あなたが考えていたものよりも明らかにエレガントではありませんが、それは機能します。

于 2012-09-21T20:12:07.080 に答える