Почему Python не может выводить типы типа scala?

Возможный дубликат:
Как работать с статической типизацией Python ~

Я в основном программист на Java с небольшим знанием python. Мне очень нравится синтаксис python и легкость, с которой программист может выразить свою идею, но также я знаю, что python динамически типизирован и, следовательно, не так быстро, как Java. Вопрос в том, почему нельзя вызывать python типа таких языков, как scala?

Ответ 1

Это не то, что Python не может, но это не так. Разница заключается в системах типов, которые выбирают разработчики языков.

Python использует утиную печать и набирает объекты, но имена нетипизированных переменных. Ограничения типа не проверяются во время компиляции; скорее, операции над объектом могут потерпеть неудачу, означая, что данный объект не подходит для соответствующего типа. Несмотря на динамическую типизацию, Python строго типизирован, запрещая операции, которые не определены (например, добавление числа в строку), а не молча, пытаясь понять их.

Scala - это статически типизированный язык, т.е. типы проверяются во время компиляции. Механизм вывода локального типа заботится о том, чтобы пользователю не требовалось аннотировать программу с информацией о избыточном типе. Операции, которые нарушают ограничения типа, приводят к ошибкам компилятора, а не ошибкам времени выполнения. Также см. Цель Scala Тип System, особенно раздел, в котором обсуждается утиная печать.

Ответ 2

Python не делает вывод статического типа, потому что он хочет позволить вам делать то, что невозможно при такой схеме. Например:

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

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

Каким должен быть тип x?

EDIT: пример:

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"

Ответ 3

Python динамически типизирован, тогда как вывод типа возможен только в статически типизированных языках. Статическое типирование невозможно реализовать без отказа от поддержки таких функций, как списки произвольных объектов.