可能重复问题:
如何处理Python静态类型?
我基本上是一名Java程序员,对Python的了解很少。我非常喜欢Python的语法和程序员能够表达自己想法的简易性,但我也知道Python是动态类型的,因此不像Java那样快速。我的问题是为什么Python不能像Scala等语言一样推断类型呢?
可能重复问题:
如何处理Python静态类型?
我基本上是一名Java程序员,对Python的了解很少。我非常喜欢Python的语法和程序员能够表达自己想法的简易性,但我也知道Python是动态类型的,因此不像Java那样快速。我的问题是为什么Python不能像Scala等语言一样推断类型呢?
Python可以做到,但它不这样做。区别在于语言设计者选择遵循的类型系统。
Python使用鸭子类型和具有类型的对象,但变量名不带类型。类型限制不是在编译时检查的;相反,对一个对象的操作可能失败,表明该对象不是合适的类型。尽管是动态类型语言,但Python是强类型的,禁止不明确定义的操作(例如将数字加入字符串),而不是试图默默地理解它们。
Scala是一种静态类型语言,即在编译时检查类型。本地类型推断机制确保用户不需要用冗余的类型信息注释程序。违反类型约束的操作会导致编译器错误,而不是运行时错误。还请参阅Scala类型系统的目的,特别是讨论鸭子类型的部分。
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"
def myfn = if (util.Random.nextBoolean) "rowdy" else 7; val x = myfn
<-- 这是完全有效的Scala。 - Daniel C. SobralAny
,Scala 不会让你对其进行任何操作,除非你匹配其类型或将其强制转换。不同之处在于,Scala 不会让你调用方法,除非它在编译时知道对象支持该方法,而 Python 则允许你调用任何方法,其适用性只有在运行时才能确定。使用动态类型语言就像对编译器说“相信我,我知道我在做什么。”使用静态类型语言就像说“检查一下,看我是否正确。” - Daniel C. SobralPython是动态类型语言,而类型推断只可能在静态类型语言中实现。如果不放弃支持任意对象列表等功能,就不可能实现静态类型。
x_int = 123; x_str = str(x_str); x_list = [c for c in x_str]
。 - Ionuț G. Stanx = 123 # 假设这是来自函数参数
;if x in [123, '234']:
; x = '123'
;else:
; x = ['2', '3', '4']
;print x if '3' in x else 'no 3'
;重新将其转换为静态类型名称会变得非常混乱。 - Lie Ryanx = 3
,而且没有其他地方涉及到 x
,那么 x
绝对是一个整数。当然,您可以应用更复杂的规则,但这就是这个想法。 - Michael Mior