接口自動化筆記02:使用遞歸獲取多層字典的任意層級值

問題

  爲什麼會使用到遞歸,是在做接口自動化的時候,我把yaml文件作爲數據配置的存儲,例如:賬號、密碼、地址等
自動化項目中的數據分離
  我讀取到的yaml是一個字典,每次都要按照從最外層級來開始定位獲取值,如果我嵌套了好幾層的話,寫起來也比較麻煩,我就想如果我能方便的找到任意一個層級的key-value就好了。
  於是接觸到了遞歸。

遞歸

  簡單的來講:一個函數在內部調用自身本身,這個函數就是遞歸函數。

關於遞歸的一種解釋:

此解釋來源
  我們使用的詞典,本身就是遞歸,爲了解釋一個詞,需要使用更多的詞。當你查一個詞,發現這個詞的解釋中某個詞仍然不懂,於是你開始查這第二個詞,可惜,第二個詞裏仍然有不懂的詞,於是查第三個詞,這樣查下去,直到有一個詞的解釋是你完全能看懂的,那麼遞歸走到了盡頭,然後你開始後退,逐個明白之前查過的每一個詞,最終,你明白了最開始那個詞的意思。。。

遞歸需要注意的地方

1、遞歸函數的理解:
來源:遞歸詳解
https://www.cnblogs.com/Fantinai/p/7806356.html

  在這裏我理解的是,當調用遞歸的時候,進入更深的下一層,但是上一層並沒有結束,而是在等待下一層的方法結束。
  這讓我想起了剝洋蔥,一層一層的剝洋蔥,每一層洋蔥就是我們的這個方法,一層層的洋蔥就是一層層的遞歸,每剝一層我們的洋蔥(遞歸的數據)就會小一些,直到找到最裏面的芯,這個時候遞歸結束,然後再把一層層的洋蔥套回去。
在這裏插入圖片描述
2.遞歸的返回(return)值:
  還拿我上面說的洋蔥來舉例吧,如果我需要獲取洋蔥芯的值,那就需要把洋蔥芯一層層的返回(return)到上一層,然後上一層再給上上一層,直到傳遞到最外層我才能獲取到這個洋蔥芯。
  我在寫獲取多層字典的方法時(示例見下面的代碼),在調用遞歸,也就是自身方法後,沒有將值return回去,所以寫的方法總是返回None。
  也就是說,我在最深層找到值後,return傳遞到了倒數第二層,這個時候倒數第二層的函數是沒有找到key值的,但是它已經從倒數第一層獲取到了返回值,所以應該繼續往上傳遞這個參數,也就是把調用遞歸函數獲取到的值return出來。

我的思路:
遞歸方法(查找的key值, 一個字典):
	for循環所有這一層的key值:
		如果:key值是我想要查找的
			return  key對應的value
		否則:如果當前key值的value是字典
			調用遞歸方法(查找的key值, 當前的key的value值):
			# 這個地方也要return返回:調用遞歸所獲取到的值

3.遞歸的深度限制:
  遞歸的深度也是有限制的,這是由於遞歸在調用自身時,過多的遞歸會導致棧溢出,默認的遞歸深度是:998層。不過在我需要查找的配置文件裏,絕對是用不到這麼深的層級的,所以目前不用擔心這個問題。

遞歸獲取多層字典的方法

最終通過傳遞字典和key值,獲取到key在多層字典中值的方法:

def get_any_key_info(key_name="", yaml_data=None):
    # for循環字典這一層的所有key值
    for i in list(yaml_data.keys()):
        # 如果當前的key是我們要找的
        if i == key_name:
            return yaml_data[i]
        # 如果當前的key不是我們找的key,並且是字典類型
        elif type(yaml_data[i]) == dict:
                # 使用遞歸方法,查找下一層的字典
                recursion = get_any_key_info(key_name, yaml_data[i])
                # 每層遞歸要返回一個值,否則函數默認返回None
                return recursion


yaml = {"host": "灰度環境", 
		"平臺一賬號": {"user1": "二狗", "user2": "大黑"},
        "平臺二賬號": {"user3": "金蘋果", "user4": "root"}}
value = get_any_key_info("user1", yaml)
print(value)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章