2010-09-20 60 views
1

有Java的如何用動態類型語言指定參數類型,即Python?

String myMethod (MyClass argument) {...} 
在Python

任何此類等同?

謝謝,托馬斯

+8

如果有語言將不會動態類型。 – delnan 2010-09-20 16:37:45

+1

去Java的最好的事情之一就是不必猜測類型,有時當事情記錄不完善時,你可以像拼圖一樣把它們放在一起,只是知道你需要構造類A並將它提供給類B以獲得工作的東西真的很好。這是我對動態語言最不喜歡的東西之一 - 我堅信,將幫助放入代碼可以幫助每個人節省下線時間,即使這會讓您鍵入一個額外的10個字符。 – 2010-09-20 17:10:02

+0

@delnan Common Lisp具有動態類型並允許聲明類型。它是可選的,但是如果指定了類型,編譯器可以生成非常高效的代碼。 – gpeche 2010-09-20 19:02:10

回答

13

號(和更多的東西這一輪長達15個字符...)

+0

我可以告訴我,這種方法只適用於MyClass的實例,換句話說,我如何告訴任何使用myMethod的人他必須傳遞一個MyClass實例的參數? – 2010-09-20 16:22:47

+4

@Tomas,你可以記錄它。 – 2010-09-20 16:34:12

+2

Tomas,在調試環境中,可以使用isinstance()和issubclass()方法通過引發異常或簡單打印消息來進行警報。 – dheerosaur 2010-09-20 16:42:42

12

沒有,沒有。

事實上,檢查類型被認爲是「非pythonic」,因爲任何類型的對象看起來足夠像預期的類型應該平等對待。

+1

「看起來足夠像預期類型」。 – 2010-09-20 16:26:35

+0

由於Python的後期綁定,在執行代碼之前,實際上不可能知道任何*的類型(文字旁邊)。所以,即使你可以指定類型,它也會對你不太好。 – 2010-09-20 16:27:13

1


在Python,這是該計劃的 責任,使用內置的() 功能,如isinstance和 issubclass()來測試變量類型 和正確的使用。 Python試圖 保持你的方式,同時給你 所有你需要實現強類型 檢查。

Why is Python a dynamic language and also a strongly typed language。也

在動態類型的語言,一個 變量是簡單地結合到 名字的值;該值有一個類型 - 如 「整數」或「字符串」或「列表」 - 但 該變量本身沒有。你可能有 有一個變量,現在, 保存一個數字,並且稍後分配一個 字符串給它,如果你需要它改變。

另外,可以使用isinstance()和issubclass()來進行類型檢查。如果你想確保參數是MyClass類型的,你可以在函數內部進行檢查。你甚至可以對參數的值進行類型轉換(如果你有一個接受這個值的構造函數)並將它賦給my_object。

8

的Python 3.x中具有功能註釋,你可以聲明參數和返回值類型:

def myMethod(argument: MyClass) -> str: 
    ... 

但目前Python做什麼和他們在一起,他們只能作爲文檔。

+0

Upvoted學習有關Python 3的新內容! – kindall 2010-09-21 19:40:51

+0

這非常有用! +1 – ApproachingDarknessFish 2013-01-07 04:06:28

4

我只想說,我完全同意類型檢查是邪惡的。但是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" 
+0

我喜歡創意(ab)使用裝飾。 – kindall 2010-09-21 19:41:31