__import__()
語法
__import__(name[, globals[, locals[, fromlist[, level]]]])
參數
- name -- 字符串,模塊的導入路徑
說明
1. 函數功能用於動態的導入模塊,主要用於反射或者延遲加載模塊。
2. __import__(A)相當於import A
3. __import__(A.B.C, fromlist(C,))相當於from A.B import C,如果fromlist不傳入值,則返回包A,如果fromlist傳入值,則返回包C
getattr()
getattr() 函數用於返回一個對象屬性值。
語法
getattr(object, name[, default])
參數
- object -- 對象。
- name -- 字符串,對象屬性。
- default -- 默認返回值,如果不提供該參數,在沒有對應屬性時,將觸發 AttributeError。
實現動態加載
__import__實現動態導入包,getattr實現動態獲取函數的引用或類對象的引用或類對象屬性的引用,將兩種方法結合就可以實現動態加載模塊的同時,動態調用函數。
參考代碼
demo.py代碼如下
from flask import request, jsonify from ihome_app.api import api @api.route("/execute", methods=["POST"]) def execute_case(): # 獲取傳入參數 req = request.get_json() # 獲取用例集 cases = req.get("cases") for case in cases: # 動態導入每個用例包的引用 case_package = __import__(f"ihome_app.test.{case}", fromlist=(case, )) # 獲取包中用例的函數引用 case_name = getattr(case_package, case) # 執行用例 case_name() return jsonify(code=0, msg="用例執行成功")
代碼中為函數的動態執行,類對象原理一樣,需要注意的是getattr方法的第二個參數類型為字符串