久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

如何在yaml文件中引用python函數(shù),?

 上海悠悠 2022-02-18

前言

經(jīng)??吹胶芏嗤瑢W問到,如何在 yaml 文件中引用一個 python 的函數(shù),?

問題分析

大家對yaml文件還處于比較陌生的階段,,yaml 和 json 文件本質(zhì)上是一樣的,都是靜態(tài)的文件,,當然不能直接引用 python 的函數(shù),。
那這時候就有人問到了,那為什么 httprunner 框架可以在yaml文件中引用函數(shù)呢,?

  • 這是因為 httprunner 框架封裝過對 yaml 文件的讀取了,,它是先讀取文件內(nèi)容,正則提取到 ${} 括號里面的函數(shù)內(nèi)容,,再把函數(shù)的值替換過去

那么我們能不能實現(xiàn)這種效果呢,?

  • 當然是可以的,可以參考httprunner的實現(xiàn),,也可以用到 python 的模板 jinja2 來實現(xiàn)。

使用模板可以編寫出可讀性更好,,更容易理解和維護的代碼,,并且使用范圍非常廣泛,,因此怎么使用模板主要取決于我們的想象力和創(chuàng)造力。
python的模板庫jinja2 功能是非常強大的,。

jinja2 模板庫

先需要pip安裝

pip install jinja2

render 函數(shù)實現(xiàn)

在yaml文件中,,通過 {{ 函數(shù)名稱() }} 來引用函數(shù)

寫個 render 函數(shù)讀取 yaml 文件內(nèi)容

import os
import jinja2
import yaml
import random

def render(tpl_path, **kwargs):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(**kwargs)

讀取到的yaml文件本質(zhì)上都是字符串來讀取的,通過jinja2 模板來讀取,,會先把函數(shù)的值替換進去,。最后再轉(zhuǎn)成python的dict結(jié)構(gòu)

import os
import jinja2
import yaml
import random

def render(tpl_path, **kwargs):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(**kwargs)

# yaml 文件調(diào)用以下函數(shù)
def rand_str():
return str(random.randint(1000000, 2000000))

if __name__ == '__main__':
r = render("aa.yml", **{"rand_str": rand_str})
print(r)
print(yaml.safe_load(r))

運行結(jié)果

name: yoyo
age: 22
tel: 1616350
{'name': 'yoyo', 'age': 22, 'rand_str': 1616350}

上面讀取函數(shù)是寫死的,我們希望能自動加載類似于debugtalk.py的文件來自動加載函數(shù)

自動加載debug.py里面的函數(shù)

寫一個debug.py 文件,,實現(xiàn) yaml 文件里面定義的函數(shù)去替換值,。

import random

# yaml 文件調(diào)用以下函數(shù)
def rand_str():
return str(random.randint(1000000, 2000000))

run.py里面定義一個函數(shù)自動讀取debug.py里面的函數(shù),生成dict 鍵值對格式

def all_functions():
"""加載debug.py模塊"""
debug_module = importlib.import_module("debug")
all_function = inspect.getmembers(debug_module, inspect.isfunction)
# print(dict(all_function))
return dict(all_function)

函數(shù)返回 {'rand_str': <function rand_str at 0x0000017B72EA8488>}

完整的run.py文件內(nèi)容

import os
import jinja2
import yaml
import importlib
import inspect

def render(tpl_path, **kwargs):
"""渲染yml文件"""
path, filename = os.path.split(tpl_path)
return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(**kwargs)

def all_functions():
"""加載debug.py模塊"""
debug_module = importlib.import_module("debug")
all_function = inspect.getmembers(debug_module, inspect.isfunction)
print(dict(all_function))
return dict(all_function)

if __name__ == '__main__':
r = render("aa.yml", **all_functions())
print(r)
print(yaml.safe_load(r))

運行結(jié)果

{'rand_str': <function rand_str at 0x000001931C248488>}
name: yoyo
age: 22
tel: 1010421
{'name': 'yoyo', 'age': 22, 'tel': 1010421}

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多