0%

[Day27] Tableau 輕鬆學 - TabPy 除錯技巧

前言

相信走到這裡,讀者應該有辦法依需求在 Tableau Desktop 中活用 TabPy。但還有一個部分有可能造成開發困難,就是不知道如何查看錯誤訊息的詳細資訊或者確認 Tableau Desktop 傳來的資料格式,也就無法根據這些資訊來修正程式碼或 TabPy 的使用方式,進而導致在除錯遇到困難。因此這篇文章會分享使用 TabPy 應該要知道的除錯技巧。

詳細錯誤訊息

若在 Tableau Desktop 使用 TabPy 的過程中,遇到類似下圖的錯誤訊息是很正常的事,我們要學習的是如何知道問題詳細資訊,並且將問題排除

錯誤訊息錯誤訊息

當我們看到錯誤訊息視窗的時候,可以切換至啟動 TabPy Server 的 cmd.exe 中查看 Log,Log 中記錄所有通訊的過程,當然也包含錯誤訊息。這裡僅擷取關鍵資訊來展示

1
2
3
4
5
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
return [x > 10000 for x in arg1]

[ERROR] : Responding with status=500, message="Error processing script", info="NameError : name 'arg1' is not defined"
[ERROR] : 500 POST /evaluate (::1) 3.99ms

這幾行 Log 告訴我們一個資訊,TabPy 要執行下方的程式,卻發現未定義的變數名稱 (name 'arg1' is not defined)

1
2
def _user_script(tabpy, _arg1):
return [x > 10000 for x in arg1]
  • _user_script(tabpy, _arg1):第一個參數 tabpy 不是我們所關心的,因此可以從第二個參數開始看。這裡的參數 _arg1 是不是很眼熟?就是在 [Day24] Tableau 輕鬆學 - TabPy 使用方法 1 提到的,TabPy 預設會以 _arg# 變數名稱來存取資料,就是因為這裡的 _user_script 函式所定義,而我們在 Tableau Desktop 所寫的 Python 程式會變成 _user_script 的本體。

到這裡,應該知道為什麼會出現錯誤訊息 name 'arg1' is not defined 了吧,因為在 _user_script 中資料的變數名稱為 _arg1 而不是 arg1

傳輸資料查看

有的時候,我們會懷疑是不是因為 Tableau Desktop 傳輸到 TabPy 的資料格式與我們想像中的不同,進而造成錯誤的發生。因此,如何查看傳輸至 TabPy 的資料也是需要學習的技術,才能更確定問題發生的原因。

銷售額大於10000 運算函式修改為

1
2
SCRIPT_BOOL("print('Hello TabPy')
return [x > 10000 for x in _arg1]", SUM([Sales]))

同樣觀察 TabPy Server 的 Log,會發現單獨一行的 Hello TabPy,這是因為 print('Hello TabPy') 這行的運行結果。也就是說,所有的 print 訊息都會被輸出到 Log 中

1
2
3
4
5
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print('Hello TabPy')
return [x > 10000 for x in _arg1]

Hello TabPy

利用這樣的運作流程,我們可以將資料 print 在 Log 來查看

1
2
SCRIPT_BOOL("print(_arg1[:10])
return [x > 10000 for x in _arg1]", SUM([Sales]))

觀察 Log 後發現,其實 Tableau Desktop 不是我們想像中的一次傳遞所有銷售額資料,而是一次只傳送一筆資料來運算,且有幾筆就會傳幾次

1
2
3
4
5
6
7
8
9
10
11
12
13
...
...
...
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print(_arg1[:10])
return [x > 10000 for x in _arg1]

[1270.53]
[INFO] : function to evaluate=def _user_script(tabpy, _arg1):
print(_arg1[:10])
return [x > 10000 for x in _arg1]

[1603.1360000000002]

結語

知道如何 Debug 是程式開發的必經之路,使用 print 來 Debug 是最萬用也是最容易的,這之中最關鍵的是需要知道 print 輸出的位置,蒐集的資訊夠多之後便能有目標性的修正 Bug,最後順利在 Tableau Desktop 使用屬於自己的 Model。

很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵