問題是這樣的,就在我這兩週開發Robot APITest Case時,我把之前同事寫的common module裡面的Library DataProcessLibrary.py 複製一份到我的專案底下的Library folder,因為我們處理的API是不一樣的Json Format,所以為了不改寫她的common module裡面的處理邏輯,我把程式碼複製出來再改寫,然後只引用該改寫過的Library來處理API response,不再透過原始的common module裡的Library,達成邏輯分離。

  但惱人的問題來了,這時候我的程式裡所有call logging.getLogger(‘robot’)的地方都出現Error: 'NoneType' object has no attribute ‘getLogger’,意思是”logging”None Object,是空的!這怎麼可能?因為logging是標準python物件,程式裡一開始有import logging應該就要可以找到logging,但其怪的是在我的DataProcessLibrary.py底下所有定義的function底下的logging變數全指向空物件,程式又必須要寫Log,所以想說先改成print避開這問題試試。

 

  但把用logging來寫log的地方改成print後問題並沒有解決,變成看到這個error: 'NoneType' object has no attribute ‘loads’,原來這次變成是import json有問題了,因為loadsjson物件的Attribute,於是我可以確定問題:在某一不知名的import限制下,我所改寫的DataProcessLibrary.py所有的import python object 敘述都已失效,引用無效。

 

  於是我上網去找方式,終於找到一個不算很好的workround,那就是我可以藉由在每一個定義的function 參數裡加入要強制引用的物件,例如:

 

Import logging

def getAccountInfo( accountid):

    rbt_log = logging.getLogger(‘robot’)

    ……..

    ……..

上述語句會在getLogger 處引發error: 'NoneType' object has no attribute ‘getLogger’

 

這時可以在def getAccountInfo函式定義中強制加入Logging預設值:

 

Import logging

def getAccountInfo( accountid, logging=logging):

    rbt_log = logging.getLogger(‘robot’)

    ……..

 

也不知道為什麼,這樣Logging物件就可以被參考到了!

 

  同理,json物件找不到也可以在def function(…. , json=json),得到解決,其他相似問題亦同,雖說不知道是為什麼,但至少這樣暫時解決了我的燃眉之急,robotDataProcessLibrary.py compiler才不會有問題,至於Solution為何?只好有空再來找原因了。

arrow
arrow

    jackterrylau 發表在 痞客邦 留言(0) 人氣()