programacion - Como programador de Java aprendiendo Python, ¿qué debería buscar?
debo aprender python (7)
El artículo al que se hace referencia contiene algunos buenos consejos que pueden citarse y malinterpretarse fácilmente. Y algunos malos consejos.
Deja atrás a Java. Empezar de nuevo. "no confíes en tus instintos [basados en Java]". Decir que las cosas son "contra-intuitivas" es un mal hábito en cualquier disciplina de programación. Cuando aprendas un nuevo idioma, comienza de nuevo y abandona tus hábitos. Tu intuición debe estar equivocada.
Los idiomas son diferentes . De lo contrario, serían del mismo idioma con una sintaxis diferente, y habría traductores simples. Debido a que no hay traductores simples, no hay un mapeo simple. Eso significa que la intuición es inútil y peligrosa.
"Un método estático en Java no se traduce en un método de clase Python". Este tipo de cosas es realmente limitado e inútil. Python tiene un decorador de staticmethod . También tiene un decorador classmethod , para el cual Java no tiene equivalente.
Este punto, por cierto, también incluyó el consejo mucho más útil sobre no envolver innecesariamente todo en una clase. "La traducción idiomática de un método estático de Java es generalmente una función de nivel de módulo".
La instrucción de
switch
de Java en Java se puede implementar de varias maneras. Primero, y ante todo, generalmente es una construcciónif elif elif elif
. El artículo es inútil a este respecto. Si está absolutamente seguro de que esto es demasiado lento (y puede demostrarlo), puede usar un diccionario de Python como un mapeo ligeramente más rápido de un valor a un bloque de código. Cambiar a ciegas el cambio al diccionario (sin pensar) es realmente un mal consejo.No use XML. No tiene sentido cuando se saca de contexto. En contexto, significa no confiar en XML para agregar flexibilidad. Java se basa en describir cosas en XML; Los archivos WSDL, por ejemplo, repiten información que es obvia al inspeccionar el código. Python se basa en la introspección en lugar de repetir todo en XML.
Pero Python tiene excelentes bibliotecas de procesamiento XML. Varios.
Getters y setters no son necesarios en Python de la forma en que se requieren en Java. En primer lugar, tiene una mejor introspección en Python, por lo que no necesita getters y setters para ayudar a crear objetos bean dinámicos. (Para eso, usa collections.namedtuple ).
Sin embargo, tiene el decorador de property que agrupará getters (y setters) en una construcción similar a un atributo. El punto es que Python prefiere atributos desnudos; cuando sea necesario, podemos agrupar getters y setters para que aparezcan como si hubiera un atributo simple.
Además, Python tiene clases de descriptor si las propiedades no son lo suficientemente sofisticadas.
La duplicación de código es a menudo un mal necesario en Java (por ejemplo, sobrecarga de métodos), pero no en Python. Correcto. Python usa argumentos opcionales en lugar de sobrecarga de métodos.
La viñeta pasó a hablar sobre el cierre; eso no es tan útil como el simple consejo de usar valores de argumento predeterminados sabiamente.
Gran parte de mi experiencia en programación está en Java, y todavía estoy haciendo la mayor parte de mi programación en Java. Sin embargo, estoy empezando a aprender Python para algunos proyectos paralelos en el trabajo, y me gustaría aprenderlo de forma independiente de mi fondo de Java, es decir, no quiero simplemente programar Java en Python. ¿Cuáles son algunas cosas que debería tener en cuenta?
Un ejemplo rápido: al consultar el tutorial de Python, me encontré con el hecho de que los parámetros mutables predeterminados de una función (como una lista) son persistentes (se recuerda de llamada a llamada). Esto fue contra-intuitivo para mí como programador de Java y difícil de entender. (Consulte here y here si no entiende el ejemplo).
Alguien también me proporcionó this lista, que encontré útil, pero breve. Alguien tiene otros ejemplos de cómo un programador de Java podría tender a hacer mal uso de Python ...? ¿O cosas que un programador de Java asumiría falsamente o tendría problemas para entender?
Editar : Ok, una breve descripción de los motivos abordados en el artículo al que me he vinculado para evitar duplicados en las respuestas (como lo sugiere Bill the Lizard). (Por favor, avíseme si me equivoco en la redacción, recién comencé con Python, así que es posible que no comprenda todos los conceptos por completo. Y un descargo de responsabilidad: estos serán muy breves, por lo que si no comprende lo que se obtiene al verificar el enlace).
- Un método estático en Java no se traduce en un método de clase Python
- Una instrucción switch en Java se traduce en una tabla hash en Python
- No use XML
- Getters y setters son malvados (hey, solo estoy citando :))
- La duplicación de código es a menudo un mal necesario en Java (por ejemplo, sobrecarga de métodos), pero no en Python
(Y si encuentras esta pregunta interesante, mira el enlace de todos modos :) Es bastante buena.)
El más grande en el que puedo pensar no es entender o no utilizar completamente el tipaje de pato. En Java, debe especificar información de tipo muy explícita y detallada por adelantado. En Python, la tipificación es tanto dinámica como implícita. La filosofía es que debes pensar en tu programa en un nivel más alto que los tipos nominales. Por ejemplo, en Python, no se usa la herencia para sustituir el modelo. La sustituibilidad viene por defecto como resultado de tipado de pato. La herencia es solo una conveniencia del programador para reutilizar la implementación.
Del mismo modo, el modismo pitónico es "perdón, no pidas permiso". La escritura explícita se considera malvada. No verifique si un parámetro es de un tipo determinado por adelantado. Intenta hacer lo que necesites con el parámetro. Si no se ajusta a la interfaz adecuada, arrojará una excepción muy clara y podrá encontrar el problema muy rápidamente. Si alguien pasa un parámetro de un tipo nominalmente inesperado pero que tiene la misma interfaz que usted esperaba, entonces ha obtenido flexibilidad de forma gratuita.
La forma en que se tratan las excepciones en Python es diferente de cómo se tratan en Java. Mientras que en Java el consejo es usar excepciones solo para condiciones excepcionales, esto no es así con Python.
En Python cosas como Iterator hacen uso del mecanismo de excepción para indicar que no hay más elementos. Pero tal diseño no se considera una buena práctica en Java.
Como Alex Martelli pone en su libro Python in a Nutshell, el mecanismo de excepción con otros lenguajes (y aplicable a Java) es LBYL (Look Before You Leap): es verificar con anticipación, antes de intentar una operación, para todas las circunstancias que podrían operación inválida
Mientras que con Python el enfoque es EAFP (es más fácil pedir perdón que permiso)
Lo más importante, desde un Java POV, es que está perfectamente bien no hacer clases para todo. Hay muchas situaciones donde un enfoque de procedimiento es más simple y más corto.
Lo siguiente más importante es que tendrá que superar la noción de que el tipo de objeto controla lo que puede hacer; más bien, el código controla qué objetos deben ser capaces de soportar en tiempo de ejecución (esto es en virtud de pato-tipado).
Ah, y usa listas nativas y dicts (no descendientes personalizados) en la medida de lo posible.
Un corolario de "No usar clases para todo": devoluciones de llamada.
La forma de Java para hacer devoluciones de llamada se basa en pasar objetos que implementan la interfaz de devolución de llamada (por ejemplo, ActionListener
con su método actionPerformed()
). Nada de esto es necesario en Python, puede pasar directamente métodos o incluso funciones definidas localmente:
def handler():
print("click!")
button.onclick(handler)
O incluso lambdas:
button.onclick(lambda: print("click!/n"))
Una cosa a la que podrías estar acostumbrado en Java que no encontrarás en Python es la estricta privacidad. Esto no es tanto algo que hay que tener en cuenta, ya que es algo que no se debe buscar (¡estoy avergonzado por cuánto tiempo busqué un Python equivalente a ''privado'' cuando comencé!). En cambio, Python tiene mucha más transparencia y una introspección más fácil que Java. Esto cae bajo lo que a veces se describe como la filosofía de "todos estamos consintiendo adultos aquí". Existen algunas convenciones y mecanismos de lenguaje para ayudar a prevenir el uso accidental de métodos "no públicos" y demás, pero la mentalidad de ocultar información prácticamente no existe en Python.
- No pongas todo en clases . La lista incorporada de Python y los diccionarios te llevarán lejos.
- No te preocupes por mantener una clase por módulo . Divida los módulos por propósito, no por clase.
- Usa la herencia para el comportamiento, no para las interfaces . No cree una clase "Animal" para heredar de "Perro" y "Gato", solo para que pueda tener un método genérico "make_sound".
Solo haz esto:
class Dog(object):
def make_sound(self):
return "woof!"
class Cat(object):
def make_sound(self):
return "meow!"
class LolCat(object):
def make_sound(self):
return "i can has cheezburger?"