W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
New in version 2.6.
為了性能最大化, Jinja2 會(huì)讓運(yùn)算符直接條用類型特定的回調(diào)方法。這意味著, 通過重載Environment.call()?來攔截是不可能的。此外,由于運(yùn)算符的工作 方式,把運(yùn)算符轉(zhuǎn)換為特殊方法不總是直接可行的。比如為了分類,至少一個(gè)特殊 方法存在。
在 Jinja 2.6 中,開始支持顯式的運(yùn)算符攔截。必要時(shí)也可以用于自定義的特定 運(yùn)算符。為了攔截運(yùn)算符,需要覆寫?SandboxedEnvironment.intercepted_binops?屬性。當(dāng)需要攔截的運(yùn)算符 被添加到這個(gè)集合, Jinja2 會(huì)生成調(diào)用?SandboxedEnvironment.call_binop()?函數(shù)的字節(jié)碼。對于一元運(yùn)算符, 必須替代地使用?unary?屬性和方法。
SandboxedEnvironment.call_binop?的默認(rèn)實(shí)現(xiàn)會(huì)使用?SandboxedEnvironment.binop_table?來把運(yùn)算符標(biāo)號翻譯成執(zhí)行默認(rèn) 運(yùn)算符行為的回調(diào)。
這個(gè)例子展示了冪(?**?)操作符可以在 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 方法,即使你不攔截這個(gè)調(diào)用。 Jinja2 內(nèi)部會(huì)調(diào)用 這個(gè)方法來對表達(dá)式求值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: