Probablemente esté cometiendo estos errores de Python: a continuación, le explicamos cómo evitarlos

Probablemente esté cometiendo estos errores de Python: a continuación, le explicamos cómo evitarlos

Hace algunos años, me embarqué en la aventura de aprender Python, ya conocía otros lenguajes de programación como PHP (el primer lenguaje que me introdujo en el desarrollo web), JavaScript (para el que ya era bastante bueno y estaba escribiendo una interfaz de usuario). biblioteca) y C #, que era responsable de mis ingresos en ese momento.

Aprendí Python trabajando en un solo de aplicación y, por lo tanto, incorporé muchas formas de JavaScript y C # de hacer cosas en mi código, lo cual fue terrible, aunque a veces funcionó. Me llevó algo de tiempo leer el código de otras personas y trabajar con otros para mejorar el idioma. Hoy me gustaría comentar algunos de los errores que cometí (en cuanto al código) al aprender Python.

Malos alcances de Python

La resolución del alcance de Python se basa en lo que se conoce como LEGB regla, que es la abreviatura de Local, micierre, GRAMOlobal siUilt-in. Aunque parece bastante simple, fue muy confuso para mí en ese momento. Entonces, echemos un vistazo al siguiente ejemplo:

Para el código anterior, hubiera esperado que funcionara y modificara la variable global x para finalmente imprimir 6. Pero, puede ser más extraño, veamos el siguiente código alterado:

¿Qué sucede? En un fragmento de código, la variable globalXda unUnboundLocalError. Sin embargo, cuando intentamos imprimir la variable, funciona. El tiene que ver con el alcance. Cuando realiza una asignación a una variable en un ámbito (por ejemplo, el ámbito de la función), esa variable se convierte en local a ese ámbito y sombrea cualquier variable con un nombre similar en el ámbito externo. Esto es lo que sucedió en el primer escenario cuando hicimosx += 1.

Si lo que pretendemos es acceder a la variable globalxcomo en el caso de nuestra funciónfoo(), podríamos hacer algo como esto:

Al usar la palabra claveglobal, permite que el ámbito interno acceda a la variable declarada en el ámbito global, es decir, variables que no están definidas en ninguna función. Del mismo modo, podríamos usarnonlocalpara producir un efecto similar:

nonlocalcomoglobalnos permite acceder a variables desde un ámbito externo, sin embargo, en el caso denonlocal, puede vincular un objeto en un ámbito primario o global.

Modificar una lista mientras itera sobre ella

Aunque este error no solo es común a Python, es un error comúnmente detectado entre los nuevos desarrolladores de Python, e incluso para algunos desarrolladores experimentados. Aunque a veces puede no parecer tan obvio, en ciertas ocasiones terminamos modificando la matriz que estamos iterando actualmente, lo que resulta en un comportamiento no apropiado. O si tenemos suerte, recibimos un error y lo notamos fácilmente.

Pero déjame darte un ejemplo de lo que quiero decir. Supongamos que, dada una matriz, necesita reducir esa matriz para contener solo los elementos pares, puede intentar hacer algo como:

En el escenario descrito, cuando eliminamos un elemento para una lista o matriz mientras iteramos, obtenemos un error al intentar acceder a un elemento que ya no está allí. Esta es una mala práctica y debe evitarse, hay mejores formas de lograr cosas similares en Python, entre ellas están las comprensiones de listas:

También puedes usar elfilterfunción para lograr lo mismo. Aunque funciona, algunos argumentan que esta no es la forma pitónica de hacerlo, y estoy de acuerdo. Pero no quiero meterme en el medio de esa discusión, prefiero darle las opciones, y usted puede investigar y decidir:

Fijación variable en cierres

Me gustaría comenzar con una prueba que publiqué en Twitter (@livecodestream) donde le pregunté a la gente sobre cuál creen que sería el resultado del siguiente fragmento:

Para muchas personas, incluido yo mismo, la primera vez que encontramos este problema creemos que el resultado es:

Sin embargo, el código en realidad resultó en algo totalmente diferente y me sorprendió mucho esto. Lo que realmente sucede es que Python haría un comportamiento de enlace tardío, según el cual los valores de las variables utilizadas en los cierres se buscan en el momento en que se llama a la función interna. Entonces, en nuestro ejemplo, cada vez que se llama a cualquiera de las funciones devueltas, el valor de i se busca en el ámbito circundante en el momento en que se llama.

Una solución a este problema puede parecer un poco "hacky", pero en realidad funciona:

Al utilizar el argumento predeterminado de la función lambda para pasar el valor de i , Podemos generar las funciones para hacer el comportamiento deseado. Me sorprendió mucho esta solución, y todavía la considero no muy elegante, sin embargo, a algunas personas les encanta.

El nombre choca con los módulos de la biblioteca estándar de Python

Este problema fue bastante común cuando comenzó a trabajar con Python. Incluso hoy, a veces cometo este error. El problema surge como resultado de nombrar uno de sus módulos con el mismo nombre que un módulo en la biblioteca estándar que se incluye con Python. Por ejemplo, puede tener un módulo llamado email.py en su código, que estaría en conflicto con el módulo de biblioteca estándar del mismo nombre.

Quizás el nombre en conflicto no genere ningún problema con su código, pero a veces anulamos una función o un módulo de la biblioteca estándar de Python, que luego se usa en una biblioteca instalada, y entra en conflicto al arrojar errores o comportarse mal. En cualquier caso, es una mala situación tener.

Un error clásico es el siguiente:

Simplemente creando una variable llamada list rompimos el acceso a la list función. Aunque hay otras formas de acceder a él (p. Ej. __builtins__.list()), debemos evitar este tipo de nombre.

Este artículo no cubre todos los errores comunes que los desarrolladores hacen al codificar en Python, sino más bien las cosas que más me costó. Si desea saber más sobre cómo escribir un excelente código Python y evitar otros errores, le recomiendo que lea Haga su código genial, estilo Python.

Este artículo fue publicado originalmente en Transmisión de código en vivo por Juan cruz martinez, fundador y editor de Live Code Stream. Es ingeniero de software con más de 10 años de experiencia en el campo, trabajando en una amplia variedad de proyectos, desde soluciones de código abierto hasta aplicaciones empresariales. Felizmente casado, con un hijo, comprometido oficialmente con JavaScript, en una relación de amor con Python, ¡y persiguiendo el sueño del escritor! Puedes leer esta pieza original aquí.

Transmisión de código en vivo también está disponible como un boletín semanal gratuito. Regístrese para recibir actualizaciones sobre todo lo relacionado con la programación, la inteligencia artificial y la informática en general.

Leer a continuación:

Apple gana batalla fiscal contra la UE, evita una multa de $ 15B

Pssst, ¡hola!

¿Desea recibir el boletín técnico diario más atrevido todos los días, en su bandeja de entrada, GRATIS? Por supuesto que sí: regístrate en Big Spam aquí.

Deja un comentario