代码之家  ›  专栏  ›  技术社区  ›  Emil

为什么python不能推断scala这样的类型?[副本]

  •  12
  • Emil  · 技术社区  · 14 年前

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

    我基本上是一个对python知之甚少的Java程序员。我真的很喜欢python的语法和程序员表达自己想法的容易程度,但我也知道python是动态类型的,因此不像Java那么快。我的问题是python为什么不能推断像scala这样的类型语言?

    3 回复  |  直到 7 年前
        1
  •  26
  •   Michael Mior    9 年前

    并不是说Python不能,而是它不能,区别在于语言设计者选择遵循的类型系统。

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

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

        2
  •  3
  •   Michael Anderson    14 年前

    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"
    
        3
  •  -3
  •   Gintautas Miliauskas    14 年前

    Python是动态类型的,而类型推断只能在静态类型的语言中实现。如果不放弃对诸如任意对象列表之类的特性的支持,就不可能实现静态类型。