運算符攔截

2018-02-24 15:39 更新

New in version 2.6.

為了性能最大化, Jinja2 會讓運算符直接條用類型特定的回調(diào)方法。這意味著, 通過重載Environment.call()?來攔截是不可能的。此外,由于運算符的工作 方式,把運算符轉(zhuǎn)換為特殊方法不總是直接可行的。比如為了分類,至少一個特殊 方法存在。

在 Jinja 2.6 中,開始支持顯式的運算符攔截。必要時也可以用于自定義的特定 運算符。為了攔截運算符,需要覆寫?SandboxedEnvironment.intercepted_binops?屬性。當(dāng)需要攔截的運算符 被添加到這個集合, Jinja2 會生成調(diào)用?SandboxedEnvironment.call_binop()?函數(shù)的字節(jié)碼。對于一元運算符, 必須替代地使用?unary?屬性和方法。

SandboxedEnvironment.call_binop?的默認實現(xiàn)會使用?SandboxedEnvironment.binop_table?來把運算符標(biāo)號翻譯成執(zhí)行默認 運算符行為的回調(diào)。

這個例子展示了冪(?**?)操作符可以在 Jinja2 中禁用:

from jinja2.sandbox import SandboxedEnvironment

class MyEnvironment(SandboxedEnvironment):
    intercepted_binops = frozenset(['**'])

    def call_binop(self, context, operator, left, right):
        if operator == '**':
            return self.undefined('the power operator is unavailable')
        return SandboxedEnvironment.call_binop(self, context,
                                               operator, left, right)

確保始終調(diào)入 super 方法,即使你不攔截這個調(diào)用。 Jinja2 內(nèi)部會調(diào)用 這個方法來對表達式求值。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號