2011-08-03 61 views
2

我想就如何檢查我收到的參數的正確性提供一些建議。Python:如何檢查...?

檢查將在C++中完成,因此如果使用Boost.Python(最好)或C API有一個很好的解決方案,請告訴我這個問題。否則,請告訴我該對象應具有哪些屬性以確保其符合標準。

所以......

  1. 你如何檢查的對象是功能
  2. 如何檢查對象是否爲裝訂方法
  3. 如何檢查對象是否爲類對象
  4. 如何檢查類對象是另一個類的孩子
+0

爲什麼你需要檢查類型的東西? – JBernardo

+0

@JBe:這是一個事件系統。我需要檢查事件的類型,以便知道哪些回調對此感興趣。 –

回答

3

如果有疑問,只需調用通常的Python內置函數並將其轉換爲C/C++即可獲得所需的效果。我只會回答Python,因爲C會查找全局變量,例如'callable',然後像調用其他Python函數一樣調用它。

  1. 爲什麼你會關心它是一個函數而不是其他類型的可調用?如果你想要的話,你可以通過使用內建的callable(f)找出它是否可以被調用,但當然不會告訴你調用它時需要傳遞哪些參數。這裏最好的事情通常只是打電話,看看會發生什麼。

  2. isinstance(f, types.MethodType)但這不會幫助,如果它是一種內建的方法。由於在你如何調用函數綁定方法沒有什麼區別,你可能只是想檢查它是否可以像上面那樣調用。

  3. isinstance(someclass, type)請注意,這將包括內置類型。

  4. issubclass(someclass, baseclass)

0

我對你們兩個非常規建議:

1)不檢查。 Python文化只是簡單地使用對象,如果它不起作用,則會發生異常。提前檢查會增加開銷,並可能限制人們使用您的代碼的方式,因爲您檢查的內容比您需要的更嚴格。

2)不要檢入C++。當把Python和C(或C++)結合起來時,我建議只用C++來完成那些需要完成的事情。其他一切都應該在Python中完成。所以在一個Python包裝函數中檢查你的參數,然後調用一個未經檢查的C++入口點。

+0

關於你的第二點,這正是我現在正在做的。 :)我的'實際'類是不可知論的Python,只有包裝類的接口。 –

+2

你的第一點:我想給腳本編寫一些關於他們犯了錯誤的指示。當軟件崩潰時它並不令人愉快,但它不會告訴你爲什麼。我只是要檢查最低限度,我不想嚴格。 –