在Jinja巨集裡使用 args和 kwargs

2021-09-11 13:43:24 字數 1628 閱讀 3264

這段時間有多個讀者問關於jinja巨集定義時的引數接受問題。這一點在《flask web開發實戰》裡沒有介紹,這篇文章作為乙個補充。

在某個晴朗的早晨,你開啟電腦,想在你的專案jinja模板裡編寫乙個巨集來簡化操作。按照直覺,你可能會像定義python函式那樣來定義巨集,傳入**kwargs來讓它接收任意數量的關鍵字引數,比如:

...複製**

或是傳入*args讓它接收任意數量的位置引數:

...複製**

遺憾的是,上面的呼叫會分別獲得下面的錯誤資訊:

jinja2.exceptions.templatesyntaxerror: expected token 'name', got '**'

複製**

jinja2.exceptions.templatesyntaxerror: expected token 'name', got '*'

複製**

在jinja中,巨集缺省會自動接收額外的關鍵字引數和位置引數,並在巨集內部提供kwargsvarargs特殊變數來獲取它們。具體來說,在定義巨集的時候,不需要進行任何宣告。在巨集的內部,你可以直接使用kwargs字典來獲取額外的關鍵字引數;同樣的,你可以使用varargs元組來獲取額外傳入的位置引數。

下面是使用kwargs的示例:

hello, }!

}複製**

你可以把這個字典傳遞給其他函式,比如url_for():

"}">}

}複製**

下面是使用varargs的示例:

hello, }!

}複製**

提示 在巨集內部,如果kwargs字典裡沒有對應的鍵,那麼會返回空字串,而不是丟擲keyerror異常;如果向varargs元組索引乙個超出範圍的下標值,也會返回空值,而不會丟擲indexerror異常。

雖然巨集自動處理額外傳入的關鍵字引數和位置引數,但是這裡有乙個隱藏的小陷阱。如果你在呼叫乙個巨集的時候傳入了額外的關鍵字引數和位置引數,但是巨集的內部並沒有使用它們,這時就會出錯。比如下面使用kwargs的示例:

hello!

}複製**

呼叫巨集的時候傳入了name引數,但是巨集內部並沒有使用它,這時jinja會丟擲下面的異常:

typeerror: macro 'say_hello' takes no keyword argument 'name'

複製**

類似的是位置引數,你會獲得下面的異常:

typeerror: macro 'say_hello' takes not more than 1 argument(s)複製**
所以,如果你想讓某個巨集接收額外的關鍵字引數或位置引數,你就分別需要在這個巨集內部至少呼叫一次(access)kwargs字典或是varargs元組。一般情況下,你並不需要擔心這個問題。

本文隸屬於《flask web開發實戰》番外文章系列。

args和 args作形參使用方法

1.args用於傳入引數個數不確定的情況 例如 def sum1 args a 0for i in range len args 1 a a i return a 執行 sum1 1,2,3,4 輸出 102.args用於當傳入的引數個數未知,但需要知道引數的名稱時 例如 defp args for...

jinja2 巨集的簡單使用總結 macro

5.參考文件 jinja2是python的模板引擎,在寫python web使用的過程中,發現macro可以節省大量的 所以做了乙個小的總結.用法基本上都是網上的文章.自己主要是寫了注意事項,也算是心得體會.巨集類似常規程式語言中的函式。它們用於把常用行為作為可重用的函式,取代 手動重複的工作。例子...

jinja2 巨集的簡單使用總結 macro

5.參考文件 jinja2是python的模板引擎,在寫python web使用的過程中,發現macro可以節省大量的 所以做了乙個小的總結.用法基本上都是網上的文章.自己主要是寫了注意事項,也算是心得體會.巨集類似常規程式語言中的函式。它們用於把常用行為作為可重用的函式,取代 手動重複的工作。例子...