2010-10-20 15 views
11

Duplicar posible:
How to deal with Python ~ static typing?¿Por qué no puede Python inferir tipos como scala?

Básicamente soy un programador de Java con poco conocimiento de python.I gusta mucho la sintaxis de Python y la facilidad con que un programador es capaz de expresar su idea, pero también soy consciente de que Python está tipeado dinámicamente y, por lo tanto, no es tan rápido como Java. Mi pregunta es ¿por qué no puede inferir Python tipos como lenguajes como Scala?

+4

Scala tiene tipos. Simplemente no tiene que escribirlos todo el tiempo (juego de palabras intencionado). – Thilo

+1

No creo que sea un duplicado. La otra pregunta es más sobre "por qué Python no necesita escribir nada". – Thilo

+1

@Emil: ¿Por qué todos quieren que todo el lenguaje de programación tenga el mismo aspecto? – pyfunc

Respuesta

24

No es que Python no pueda, pero no es así. La diferencia está en los sistemas de tipos que los diseñadores de los idiomas eligen seguir.

Python utiliza el tipado de pato y ha tipeado objetos pero sin tipo de nombres de variables. Las restricciones de tipo no se verifican en tiempo de compilación; más bien, las operaciones en un objeto pueden fallar, lo que significa que el objeto dado no es del tipo adecuado. A pesar de estar tipado dinámicamente, Python tiene un fuerte tipeo, que prohíbe las operaciones que no están bien definidas (por ejemplo, agregar un número a una cadena) en lugar de tratar de encontrarlas en silencio.

Scala es un lenguaje estáticamente tipado, es decir, los tipos se comprueban en tiempo de compilación. Un mecanismo de inferencia de tipo local se ocupa de que el usuario no tenga que anotar el programa con información de tipo redundante. Las operaciones que rompen las restricciones de tipo conducen a errores de compilación, no a errores de tiempo de ejecución. También vea The Purpose of Scala's Type System, especialmente la sección donde se discute la tipificación de pato.

-2

Python se tipea dinámicamente, mientras que la inferencia de tipo solo es posible en lenguajes tipados estáticamente. La tipificación estática sería imposible de implementar sin descartar el soporte de funciones como listas de objetos arbitrarios.

+0

No estoy seguro. Para "x = 123", el compilador debería poder inferir que x es un número entero. – Thilo

+1

@Thilo: "x = 123; x = str (x); x = [c para c en x]", ¿es x una int, una cadena o una lista? –

+0

@Lie Ryan, creo que el compilador podría reescribir los nombres de los identificadores, para que todos puedan vivir juntos. 'x_int = 123; x_str = str (x_str); x_list = [c para c en x_str] '. –

2

Python no hace inferencia de tipo estático, porque quiere permitirte hacer cosas que son imposibles bajo dicho esquema. Por ejemplo:

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

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

Cuál debería ser el tipo de x ser?

EDIT: ejemplo fue:

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

Bueno ... podría generar dos funciones detrás de escena: Secuencia -> str (o tal vez Secuencia -> Secuencia) e int -> int. Algo así como una sobrecarga. –

+0

OK, lo ajustaré a algo que es aún más trivial pero aún más difícil de rastrear. –

+1

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

Cuestiones relacionadas