W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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)用 這個方法來對表達式求值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: