Python_getattr+__import__ 實現動態加載模塊、類對象或函數


__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方法的第二個參數類型為字符串


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM