2010-10-20 19 views
11

Powiel możliwe:
How to deal with Python ~ static typing?Dlaczego python nie może wnioskować o typach takich jak scala?

jestem w zasadzie programista Java z niewielką znajomością python.I naprawdę jak składni Python i łatwości, z jaką programista jest w stanie wyrazić swój pomysł, ale również jestem świadomy, że python jest dynamicznie wpisany, a zatem nie jest tak szybki jak Java. Moje pytanie brzmi, dlaczego nie można pytać typu wypowiadania takich jak języki, takie jak scala?

+4

Scala zawiera typy. Po prostu nie musisz ich wpisywać przez cały czas (kalambur przeznaczony). – Thilo

+1

Nie sądzę, że jest to duplikat. Drugie pytanie dotyczy raczej "dlaczego Python w ogóle nie wymaga pisania". – Thilo

+1

@Emil: Dlaczego każdy chce, aby cały język programowania wyglądał tak samo? – pyfunc

Odpowiedz

24

Nie jest tak, że Python nie może, ale tak nie jest. Różnica polega na systemach typów, które wybierają projektanci języków.

W języku Python używane jest pisanie kaczkami, a do wpisywania obiektów należą nietypowe nazwy zmiennych. Ograniczenia typu nie są sprawdzane podczas kompilacji; raczej operacje na obiekcie mogą się nie powieść, co oznacza, że ​​dany obiekt nie jest odpowiedniego typu. Pomimo tego, że jest napisany dynamicznie, Python jest silnie typowany, zabraniając operacjom, które nie są dobrze zdefiniowane (na przykład dodanie numeru do ciągu znaków), zamiast cicho próbować je zrozumieć.

Scala jest językiem pisanym statycznie, tzn. Typy są sprawdzane podczas kompilacji. Mechanizm wnioskowania lokalnego typu dba o to, aby użytkownik nie był zobowiązany do adnotowania programu za pomocą nadmiarowych informacji o typie. Operacje, które łamią wiązania typów, prowadzą do błędów kompilatora, a nie błędów środowiska wykonawczego. Zobacz także The Purpose of Scala's Type System, szczególnie w sekcji, w której omawia się pisanie kaczkami.

-2

Python jest wpisywany dynamicznie, a wnioskowanie typu jest możliwe tylko w językach ze statycznymi typami. Pisanie statyczne byłoby niemożliwe do zrealizowania bez porzucania obsługi funkcji, takich jak listy dowolnych obiektów.

+0

Nie jestem pewien. Dla "x = 123" kompilator powinien móc wywnioskować, że x jest liczbą całkowitą. – Thilo

+1

@Thilo: "x = 123; x = str (x); x = [c dla c na x]", to jest x int, ciąg znaków lub lista? –

+0

@Lie Ryan, domyślam się, że kompilator może przepisać nazwy identyfikatorów, aby wszyscy mogli żyć razem. 'x_int = 123; x_str = str (x_str); x_list = [c dla cw x_str] '. –

2

Python nie wykonuje inferencji typu statycznego, ponieważ chce umożliwić ci wykonywanie czynności niemożliwych w ramach takiego schematu. Na przykład:

def myfn(): 
    if random.random() > 0.5 
    return "howdy" 
    else: 
    return 7 

x = myfn() # Am I a string or an integer? 

Jaki powinien być typ x?

Edycja: przykładem:

def myfn(x): 
    try: 
    return str(x[0]+1) + " is my favourite" 
    catch IndexError: 
    return x+1 

myfn(1) # = 2 
myfn([2,4,6]) # = "3 is my favourite" 
+0

Cóż ... może wygenerować dwie funkcje za sceną: Sekwencja -> str (lub może Sekwencja -> Sekwencja) i int -> int. Trochę jak przeciążenie. –

+0

OK, dostosuję to do czegoś, co jest jeszcze bardziej banalne, ale trudniejsze do namierzenia. –

+1

def myfn (x: Array [Int]) = try Left (str (x (0) + 1) catch {case e: ArrayIndexOutOfBoundsException => Prawo (x + 1) –

Powiązane problemy