簡體   English   中英

如何使用 Python 進行調試

[英]How Debug with Python

我是一名 Java 開發人員,今天我開始使用 Python(v3.7,使用 PyCharm)。 我試圖用一個包( boto3 )創建一個“hello world”應用程序:

import boto3

client = boto3.resource('ec2', region_name='eu-central-1')
client.  # unlike java, no suggestion (method or attribute of client object) from the IDE

我讀過PyCharm 代碼完成並沒有給出建議,我明白由於動態類型 PyCharm 無法確定client的類型,因此它無法提出任何建議(例如對象的方法或屬性)。

因此,在調試期間,我被迫查找文檔以識別返回對象的屬性和方法。 這是容易出錯且費力的(例如,錯別字或我假設不同類型的對象導致執行期間attribute not found錯誤)。

然后,我在調試模式下執行我的代碼:我試圖在評估框中識別返回對象的屬性和方法,這也很不方便。

你如何在 Python 中處理這種情況? 你有好的參考嗎?

如果您的編輯器行為異常(或者如果您在服務器上沒有 IDE),您可以使用代碼本身,因為維護人員可能已將文檔包含在代碼中並從代碼本身生成網頁/PDF。 在這些情況下,在特定對象上嘗試help()總是值得的,例如:

import boto3
client = boto3.resource('ec2', region_name='eu-central-1')
help(boto3)
help(client)

但這僅在存在無法保證的文檔字符串(代碼文檔)時才有效。 對於這種情況,請使用以下函數:

  • type()確定對象的類型
  • dir()列出對象中的所有名稱(變量、函數等)
  • vars()列出存儲在__dict__屬性中的對象屬性

如果您遇到更棘手的事情,例如沒有__dict__屬性的對象,請始終使用dir()檢查,因為此類對象可能使用__slots__比基本的__dict__更有效。 這在 C/C++/Cython 擴展中很常見,並且會導致vars()函數失敗並出現錯誤:

TypeError: vars() argument must have __dict__ attribute

這在模塊級別也很有效:

import boto3
dir(boto3)

這對於直接在控制台中使用很方便。 你的編輯應該這樣做,但顯然出於某種原因沒有這樣做。

還有一種情況,模塊的行為很奇怪(找不到示例,但過去發生在我身上),並且與在容器化“變量”(例如boto3 )下導入不同,它會將其他符號泄漏到全局變量中。

如果您在函數中導入,則可以使用globals()甚至locals()輕松調試。

一旦代碼變得足夠煩人,只需跳入pdb調試器,它允許您以比手動重新運行程序並等待控制台中甚至可能不顯示的消息(例如條件不滿足或所以)。

您可以在 Python 中使用類型注釋來為您的 IDE 提供提示

import boto3

client: boto3.Session = boto3.resource('ec2', region_name='eu-central-1')

現在,當您鍵入client. 你應該得到提示

如果您想對代碼執行靜態分析並為所有方法添加類型注釋,這將特別有用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM