为什么python不能像scala那样推断类型?

时间:2010-10-20 07:00:59

标签: python type-inference

  

可能重复:
  How to deal with Python ~ static typing?

我基本上是一个对python知之甚少的Java程序员。我非常喜欢python的语法和程序员能够轻松表达他的想法,但我也知道python是动态类型的,因此是没有Java快。我的问题是为什么python不能像scala这样的语言推断类型?

3 个答案:

答案 0 :(得分:26)

不是Python不能,但事实并非如此。不同之处在于语言设计者选择遵循的类型系统。

Python使用duck typing并且有类型对象但是无类型的变量名。在编译时不检查类型约束;相反,对象上的操作可能会失败,表示给定的对象不是合适的类型。尽管是动态类型的,但Python是强类型的,禁止未明确定义的操作(例如,向字符串添加数字),而不是默默地尝试理解它们。

Scala是一种静态类型语言,即在编译时检查类型。本地类型推断机制注意不要求用户使用冗余类型信息来注释程序。破坏类型约束的操作会导致编译器错误,而不是运行时错误。另请参阅The Purpose of Scala's Type System,尤其是讨论鸭子类型的部分。

答案 1 :(得分:2)

Python不进行静态类型推断,因为它希望让你做一些在这种方案下不可能完成的事情。例如:

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

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

x的类型应该是什么?

编辑:示例是:

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"

答案 2 :(得分:-3)

Python是动态类型的,而类型推断只能在静态类型语言中使用。如果不删除对任意对象列表等功能的支持,就无法实现静态类型。