這段時間有多個讀者問關於jinja巨集定義時的引數接受問題。這一點在《flask web開發實戰》裡沒有介紹,這篇文章作為乙個補充。
在某個晴朗的早晨,你開啟電腦,想在你的專案jinja模板裡編寫乙個巨集來簡化操作。按照直覺,你可能會像定義python函式那樣來定義巨集,傳入**kwargs來讓它接收任意數量的關鍵字引數,比如:
...複製**
或是傳入*args讓它接收任意數量的位置引數:
...複製**
遺憾的是,上面的呼叫會分別獲得下面的錯誤資訊:
jinja2.exceptions.templatesyntaxerror: expected token 'name', got '**'
複製**
jinja2.exceptions.templatesyntaxerror: expected token 'name', got '*'
複製**
在jinja中,巨集缺省會自動接收額外的關鍵字引數和位置引數,並在巨集內部提供kwargs和varargs特殊變數來獲取它們。具體來說,在定義巨集的時候,不需要進行任何宣告。在巨集的內部,你可以直接使用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可以節省大量的 所以做了乙個小的總結.用法基本上都是網上的文章.自己主要是寫了注意事項,也算是心得體會.巨集類似常規程式語言中的函式。它們用於把常用行為作為可重用的函式,取代 手動重複的工作。例子...