回答
號(和更多的東西這一輪長達15個字符...)
我可以告訴我,這種方法只適用於MyClass的實例,換句話說,我如何告訴任何使用myMethod的人他必須傳遞一個MyClass實例的參數? – 2010-09-20 16:22:47
@Tomas,你可以記錄它。 – 2010-09-20 16:34:12
Tomas,在調試環境中,可以使用isinstance()和issubclass()方法通過引發異常或簡單打印消息來進行警報。 – dheerosaur 2010-09-20 16:42:42
沒有,沒有。
事實上,檢查類型被認爲是「非pythonic」,因爲任何類型的對象看起來足夠像預期的類型應該平等對待。
「看起來足夠像預期類型」。 – 2010-09-20 16:26:35
由於Python的後期綁定,在執行代碼之前,實際上不可能知道任何*的類型(文字旁邊)。所以,即使你可以指定類型,它也會對你不太好。 – 2010-09-20 16:27:13
號
在Python,這是該計劃的 責任,使用內置的() 功能,如isinstance和 issubclass()來測試變量類型 和正確的使用。 Python試圖 保持你的方式,同時給你 所有你需要實現強類型 檢查。
從Why is Python a dynamic language and also a strongly typed language。也
在動態類型的語言,一個 變量是簡單地結合到 名字的值;該值有一個類型 - 如 「整數」或「字符串」或「列表」 - 但 該變量本身沒有。你可能有 有一個變量,現在, 保存一個數字,並且稍後分配一個 字符串給它,如果你需要它改變。
另外,可以使用isinstance()和issubclass()來進行類型檢查。如果你想確保參數是MyClass類型的,你可以在函數內部進行檢查。你甚至可以對參數的值進行類型轉換(如果你有一個接受這個值的構造函數)並將它賦給my_object。
的Python 3.x中具有功能註釋,你可以聲明參數和返回值類型:
def myMethod(argument: MyClass) -> str:
...
但目前Python做什麼和他們在一起,他們只能作爲文檔。
Upvoted學習有關Python 3的新內容! – kindall 2010-09-21 19:40:51
這非常有用! +1 – ApproachingDarknessFish 2013-01-07 04:06:28
我只想說,我完全同意類型檢查是邪惡的。但是python也非常靈活,而且我心情很惡劣。此代碼將在運行時生效,而不是編譯時間。你可以爲返回類型做類似的事情。像這樣的東西可能對調試很有用,因爲它是一個裝飾器,所以很容易刪除。
因爲它對調試很有用,所以你必須有一種情況,即兩種類型的所有屬性都被訪問但是具有不同的語義。所以這是一個相當有限的情況。除此之外,當代碼運行時,無論如何你都會遇到typerror。好消息是這幾乎從來都不是問題。我真的不知道爲什麼來自靜態類型語言的人爲此做了這麼大的事情。
def types(*args, **kwargs):
arg_types = args
kwarg_types = kwargs
def decorator(f):
def func(*args, **kwargs):
for arg, arg_type in zip(args, arg_types):
if not isinstance(arg, arg_type):
raise TypeError("Wrong type suckah")
for kw, arg in kwargs.items():
if not isinstance(arg, kwarg_types[kw]):
raise TypeError("this is a bad error message")
return f(*args, **kwargs)
return func
return decorator
@types(int, str, bool, flag=bool)
def demo(i, strng, flag=False):
print i, strng, flag
demo(1, "foo", True)
try:
demo("foo", "bar", flag="foobar")
except TypeError:
print "busted on posargs"
try:
demo(1, "foo", flag=2)
except TypeError:
print "busted on keyargs"
try:
demo(1, "foo", 3)
except TypeError:
print "no use sneaking it through"
我喜歡創意(ab)使用裝飾。 – kindall 2010-09-21 19:41:31
- 1. 動態類型語言中的類型
- 2. 如何在動態類型語言中描述函數參數?
- 3. 如何處理動態語言中的錯誤參數類型?
- 4. 用動態類型語言重構
- 5. 動態Linq:如何指定StringComparison類型?
- 6. 未指定類型參數
- 7. 動態類型語言中的文檔
- 8. 口譯員和動態類型語言
- 9. 以動態語言檢查類型
- 10. 如何指定參數類型?
- 11. 如何指定DTExec參數類型
- 12. 如何避免指定類型參數
- 13. 動態調用動態類型參數
- 14. 靜態類型語言的類型在運行時決定?
- 15. Web服務跨語言參數類型
- 16. (開放泛型類型)泛型類型,沒有指定參數
- 17. 在靜態類型語言D中使用動態類型輸入
- 18. 如何在類型描述中指定類定義作爲參數類型
- 19. 動態設置泛型類型參數
- 20. 創建動態泛型類型參數
- 21. 與類型的動態計數泛型類型參數
- 22. 設計模式列表僅適用於靜態類型語言,但不適用於動態類型語言?
- 23. 如何不指定任何類型創建構造泛型類型參數
- 24. 用scala語言創建子類的使用類型參數
- 25. 如何指定泛型類型作爲函數參數
- 26. 如何在參數類型上定義參數類型?
- 27. 如何確定嵌套類型參數的類型參數
- 28. 傳遞類型參數動態地泛型類型
- 29. 自然語言類型的子類型
- 30. 弱類型或強類型語言
如果有語言將不會動態類型。 – delnan 2010-09-20 16:37:45
去Java的最好的事情之一就是不必猜測類型,有時當事情記錄不完善時,你可以像拼圖一樣把它們放在一起,只是知道你需要構造類A並將它提供給類B以獲得工作的東西真的很好。這是我對動態語言最不喜歡的東西之一 - 我堅信,將幫助放入代碼可以幫助每個人節省下線時間,即使這會讓您鍵入一個額外的10個字符。 – 2010-09-20 17:10:02
@delnan Common Lisp具有動態類型並允許聲明類型。它是可選的,但是如果指定了類型,編譯器可以生成非常高效的代碼。 – gpeche 2010-09-20 19:02:10