Java dev learning Python: ¿qué conceptos necesito para envolver mi cabeza?

38

Antecedentes: He ejecutado algunos tutoriales y he escrito algunos proyectos pequeños. Todo va bien con Google y StackOverflow .

Varias veces en los últimos días me he preguntado "¿qué me estoy perdiendo?" - Siento que todavía estoy pensando en Java mientras escribo en Python.

Esta pregunta sobre StackOverflow está llena de consejos sobre qué recursos se pueden leer para aprender Python, pero sigo sintiendo que soy un desarrollador de Java con un diccionario (sin intención de hacerlo) para traducir a Python.

Lo que realmente quiero hacer es refactorizar mi cabeza para poder escribir Python Pythonic en lugar de Java disfrazado de Python, sin perder tampoco mis habilidades de Java.

Entonces, el punto crucial de mi pregunta es: ¿qué conceptos realmente necesita un desarrollador de Java aprender a pensar en Pythonic? Esto incluye cualquier cosa que deba ser desaprendida.

Nota: estoy preguntando sobre los conceptos del lenguaje, no sobre la sintaxis del idioma.

    
pregunta LRE 13.02.2011 - 10:21

5 respuestas

40

Algunos puntos además de lo que ya se dijo:

  • Python es dinámico. La creación de una clase es una declaración ejecutable , al igual que la importación de un módulo; Puede hacerse condicional. Una clase puede ser alterada después de la creación; esto permite una fácil metaprogramación y AOP.

  • No hay interfaces; reglas de escritura de pato. Si los necesita desesperadamente, hay "clases base abstractas (ABCs) ', pero por lo general no pierde las interfaces, ya que de todos modos no hay verificación de tipos estática.

  • Aunque todo es un objeto, las funciones vienen antes que los objetos. Tener funciones justas (y no clases) en un módulo es perfectamente correcto.

  • Todo es una entidad de primera clase. Pasar funciones como parámetros, devolverlas y asignarlas a las variables es la norma. Lo mismo ocurre con las clases. Los métodos son simplemente funciones; puede manejar un método de instancia como si fuera una función regular, pasarlo por alto, etc.

  • Use dicts, conjuntos, listas y tuplas incorporados. Las listas y los dados son mutables, las tuplas no lo son. Todos ellos son muy eficientes y sintácticamente sucintos. Acostúmbrate a devolver varios valores de una función usando una tupla (ni siquiera necesitas paréntesis). Acostumbrarse a reemplazar jerarquías complejas de objetos muy simples con artilugios hechos de listas simples, tuplas y dados ("tablas de hash"), simplifica la vida.

  • Python tiene un poco de soporte de FP; Aprender listas de comprensión y luego iteradores y generadores. Estas ayudan mucho.

  • Cualquier operador puede sobrecargarse definiendo los métodos adecuados, por lo que la adición o comparación puede devolver lo que quieras. Recuerda esto trabajando con cosas como SQLAlchemy.

  • No hay nulo, solo Ninguno, un objeto de pleno derecho. Puede imprimir Ninguno muy bien, etc. Pasando Ninguno, donde otra instancia es el resultado esperado, generalmente en AttributeError, no en un NPE, a veces más allá de la tubería de ejecución.

  • Debido a la naturaleza completamente dinámica de Python, casi no tiene controles estáticos . Puede referirse a un nombre que nunca existe en su programa (por ejemplo, un error tipográfico), o solo se define en una ruta de ejecución particular, y nada le recordará hasta que la ejecución llegue a esta referencia y se genere un error de nombre. Tenga cuidado con el alcance de sus variables y escriba más pruebas unitarias.

  • Debido a la naturaleza completamente dinámica de Python, los objetos casi siempre son maleables. Por lo general, puede agregar campos y métodos incluso a una instancia y, por lo tanto, eliminar o sobrescribir inadvertidamente su estado o conjunto de métodos. Ten cuidado al asignar atributos. Esto también permite posibilidades interesantes :)

  • No hay constantes simbólicas , solo variables. Compruebe que no sobrescribe inadvertidamente una 'constante'. Si quiere estar seguro de que no puede sobrescribir una constante, use una función o una propiedad (que es una función disfrazada).

  • Los hilos de Python son buenos para el procesamiento de E / S enlazado, pero no para CPU. No intente acelerar una tarea computacional ejecutándola en hilos paralelos.

respondido por el 9000 14.02.2011 - 02:37
14

Lea este artículo: Python no es Java . (Además de la mayoría de los otros artículos en la barra lateral, vale la pena leerlos, aunque no están relacionados con Java). El artículo ofrece algunas indicaciones excelentes sobre cómo los programadores de Java pueden usar mal Python (y cómo no hacerlo).     

respondido por el Cyclops 13.02.2011 - 21:33
3

Me mudé de Java a Python y una de las cosas más útiles que encontré fue poder probar el código desde el intérprete de línea de comandos. Escriba python en la línea de comandos y ejecute su código desde allí hasta que lo haga correctamente.

Los marcos también estaban un poco menos definidos en Python. Hay 10s de marcos web para principiantes. Django reemplaza más o menos a Spring y SQL Alchemy por Hibernate.

    
respondido por el Bassdread 13.02.2011 - 14:20
2

Una cosa importante sería entender la tipificación dinámica; Otra es que los objetos son mutables y públicos. Menos importante, al menos inicialmente, es el enlace de nombre frente a las variables.

class MyJob:
    pass        # an empty class
job = MyJob()
job.title = "Ruler of Omicron Persei 8"
job.startDate = "2086"
job.startDate = time.strptime("2035/01/02", "%Y/%m/%d")
myjobtitle = job.title
import new
def myjobduration(self, when):  # create a function
    return when - time.mktime(self.startDate)
MyJob.duration = myjobduration
job.duration(time.time()) # now

Aquí, myjobtitle y el valor de job.title apuntan al mismo objeto. Al atributo de clase job.startDate primero se le asignó una cadena, luego a un objeto de tiempo. Y a través de todo esto, la instancia de trabajo e incluso la clase en sí podrían cambiarse dinámicamente.

    
respondido por el Arcege 13.02.2011 - 13:25
1

También puede consultar Jython . Es posible que solo sea compatible con Python 2.5, pero nos parece realmente poderoso poder realizar un prototipo rápido con Python y luego volver a escribir en Java si es necesario.

Basado en mi respuesta a ¿En qué debo pensar cuando cambio de Python a Java? como ¡esa pregunta ahora se ha cerrado como un duplicado de esta!

    
respondido por el Mark Booth 30.03.2012 - 15:43

Lea otras preguntas en las etiquetas