簡體   English   中英

檢查某些內容是否為列表

[英]Check if something is a list

檢查某些內容是否為列表的最簡單方法是什么?

方法doSomething具有參數ab 在該方法中,它將遍歷列表a並執行某些操作。 在循環之前,我想要一種方法來確保a是一個list - 從而避免錯誤或傳遞字符串然后從每個循環中獲取一個字母的不幸情況。

之前一定要問過這個問題 - 但是我的谷歌讓我失望了。 干杯。

要啟用更多用例,但仍將字符串視為標量,請不要檢查是否為列表,請檢查它是否為字符串:

if not isinstance(a, basestring):
    ...

Typechecking會損害代碼的通用性,簡單性和可維護性。 它很少用於好的,慣用的Python程序中。

人們想要進行類型檢查有兩個主要原因:

  1. 如果調用者提供了錯誤的類型,則發出錯誤。

    這不值得你花時間。 如果用戶為您正在執行的操作提供了不兼容的類型,則在達到兼容性時將引發錯誤。 令人擔憂的是,這可能不會立即發生,但它通常不需要很長時間,並且會使代碼更加健壯,簡單,高效且易於編寫。

    通常人們堅持這一點,希望他們可以捕捉用戶可以做的所有愚蠢的事情。 如果用戶願意做任意愚蠢的事情,那么你無能為力阻止他。 Typechecking主要有可能保持一個用戶自己輸入的類型,這些用戶可以替換被替換的用戶,或者當用戶認識到你的函數實際上應該是多態的並提供可以接受相同操作的不同內容時。

    如果我有一個龐大的系統,許多人所做的很多東西應該合適,我會使用像zope.interface這樣的系統來測試所有東西是否合適。

  2. 根據收到的參數類型做不同的事情。

    這會使您的代碼更糟糕,因為您的API不一致。 功能或方法應該做一件事,而不是根本不同的事情。 這最終成為一項通常不值得支持的功能。

    一種常見的情況是有一個參數可以是foo或foos列表。 更清潔的解決方案就是接受一個foos列表。 您的代碼更簡單,更一致。 如果它是一個重要的常見用例,只有一個foo,你可以考慮使用另一個方便的方法/函數來調用接受foos列表並且什么都不會丟失的方法/函數。 提供第一個API不僅會更復雜,也更不一致,但是當類型不是預期的確切值時,它會中斷; 在Python中,我們根據對象的功能區分對象,而不是實際類型。 接受任意迭代或序列而不是列表以及任何像foo一樣工作的東西,而不是特別需要foo,這幾乎總是更好。

正如你所知,我認為在正常情況下,任何一個理由都不足以引起人們的注意。

在循環之前,我想要一種確保a是列表的方法

記錄功能。

通常認為在Python中執行類型檢查不是一種好的風格,但請嘗試

if isinstance(a, list):
  ...

(我想你也可以檢查a.__iter__存在。)

暫無
暫無

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

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