Foros del Web » Programando para Internet » Python »

Bugs y errores de diseño del lenguaje Python

Estas en el tema de Bugs y errores de diseño del lenguaje Python en el foro de Python en Foros del Web. Python es un lenguaje muy potente desde lo expresivo pero tiene fallas incomprensibles, este podria ser un lugar para colectaras: Empecemos...... @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: ...
  #1 (permalink)  
Antiguo 21/04/2014, 07:10
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Bugs y errores de diseño del lenguaje Python

Python es un lenguaje muy potente desde lo expresivo pero tiene fallas incomprensibles, este podria ser un lugar para colectaras:

Empecemos......


Código Python:
Ver original
  1. # Parametros que sobreviven a las llamadas
  2.  
  3. def foo(a, L = []):
  4.     L.append(a)
  5.     print(L)
  6.  
  7. foo(1)  # [1]
  8. foo(2)  # [1, 2]

Tipo: bug
Afecta: todas las versiones (al menos hasta la 3.4)

Código Python:
Ver original
  1. # Ruptura del espacio de variables
  2. # UnboundLocalError: local variable 'x' referenced before assignment
  3. x=0
  4.  
  5. def f():
  6.     x+=3
  7.     print(x)
  8.  
  9. f()

Tipo: bug
Afecta: todas las versiones (al menos hasta la 3.4)

Fuente: http://programmers.stackexchange.com...acks-of-python
__________________
Salu2!

Última edición por Italico76; 21/04/2014 a las 07:22
  #2 (permalink)  
Antiguo 21/04/2014, 08:29
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bugs y errores de diseño del lenguaje Python

Creo que no estás entiendo sobre como trabaja Python, antes de pensar en "un fallo", deberías aprender más y analizar porque sucede esto o el otro.
Ese código está mal hecho, si te fijas, la variable "x" es una variable local ya que al llamar a una función, la misma la toma como local (por más que parezca global), entónces se debe pasar la variable a global en la función antes de poder trabajar con ella o pasar la variable x como argumento, aquí te dejo dos códigos para que los estudies bastante así podés entender como trabaja Python, antes de pensar en un fallo:

Código Python:
Ver original
  1. x = 0
  2.  
  3. def f():
  4.     global x
  5.     x += 3
  6.     print x # Muestra en la consola 3
  7.  
  8. f()
  9.  
  10. raw_input()

Aquí hay otra forma más:

Código Python:
Ver original
  1. x = 0
  2.  
  3. def f(x):
  4.     x += 3
  5.     print x # Muestra en la consola 3
  6.  
  7. f(x)
  8.  
  9. raw_input()

También podés usar este método:

Código Python:
Ver original
  1. x = 0
  2.  
  3. def f(x):
  4.     x += 3
  5.     return x
  6.  
  7. print f(x)
  8.  
  9. raw_input()

Veo que no prestás atención a las personas que intentan ayudarte, yo se muy poco, pero aquí te demuestro que el error es del programador, no del lenguaje. Analizá esos códigos y comprendé porque deben ser así, lee algún manual para entender como funcionan las variables.

De todas maneras aquí te dejo una buena explicación y ayuda sobre como trabajan las variables en este Hermoso lenguaje que es Python:

http://elclubdelautodidacta.es/wp/20...-una-variable/

Que tengas buen día.

Última edición por Principe_Azul; 21/04/2014 a las 08:44
  #3 (permalink)  
Antiguo 21/04/2014, 09:46
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Bugs y errores de diseño del lenguaje Python

Python es un lenguaje orientado a objetos pero no todo es lo que deberia....... hay funciones built-in (en el core) que deberian ser metodos y no funciones globales.

Ejemplo:

Código Python:
Ver original
  1. items = []
  2. items.append("uno")
  3. items.append("dos")
  4. items.append("tres")
  5.  
  6. # quiero conocer la longitud...  items.length() ?  items.count() ?
  7.  
  8. len(items)

A posteriori se incorporó el metodo magico __len__() que llama internamente a len() con la ventaja de que puede sobrescribirse pero sigue yendo en contra del principio de ser un lenguaje "predecible" que es uno de los fundamentos de Python.


---
La intencion del hilo no es para nada desanimar a quien quiera aprender Python sino aclarar que por ser un lenguaje aun en desarrollo tiene algunas inconcistencias.

---
@Principe_Azul : estas equivocado..... no hay intencionalidad de pasar ninguna variable (x) como parametro a la funcion : f(x) .....

Este hilo no intenta ser espacio de discusion sino de APORTES con sus fuentes (StackFlow, FDW, etc) si cabe el caso de atribuciones.
__________________
Salu2!

Última edición por Italico76; 21/04/2014 a las 10:35
  #4 (permalink)  
Antiguo 21/04/2014, 14:08
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: Bugs y errores de diseño del lenguaje Python

En tu primer post creo que ignoras las ventajas de disponer de variables locales y variables globales y te aseguro que python no es el único lenguaje en que existen.
El segundo ya no lo entiendo demasiado, pero creo que es mejor una función buil-in que un método en cada clase. De todas formas tienes sitios más adecuados para reportar tus 'bugs'. :)
http://bugs.python.org/

Saludos.
  #5 (permalink)  
Antiguo 21/04/2014, 14:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Bugs y errores de diseño del lenguaje Python

@sukoy : no tengo creditos por nada de eso.... no tengo nada que reportar (es sabido)... existen ya patchs para algunos de esos comportamientos pero no dejan de ser "walkarrounds"

En la funcion a la que te refieres L[] no es global..... su scope es local a la funcion foo()

---
En una epoca intente hacer lo mismo en el foro de PHP pero recibí bastantes agresiones de moderadores y demas usuarios......ojala aca si haya apoyo de divulgar las fallas del lenguaje para estar prevenidos ante un fallo inexplicable en nuestro flujo.
__________________
Salu2!
  #6 (permalink)  
Antiguo 21/04/2014, 14:46
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 1 mes
Puntos: 18
Respuesta: Bugs y errores de diseño del lenguaje Python

Prueba esto:

Código Python:
Ver original
  1. def foo(a, L = []):
  2.     L.append(a)
  3.     print id(L)
  4.     return L
  5.  
  6. print foo(1)
  7. print foo(2)

Tendria algún sentido que L se reiniciara a cada llamada a la función? Si quieres eso puedes hacerlo de otra forma.

Código Python:
Ver original
  1. x=0
  2. def f():
  3.     x=0
  4.     x+=3
  5.     return x
  6.  
  7. print f(), id(f())
  8. print x, id(x)
Este caso es mas obvio, que pasaria si todas las variable sde todos los módulos estuvieran disponibles en todas las funciones?
  #7 (permalink)  
Antiguo 21/04/2014, 15:23
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bugs y errores de diseño del lenguaje Python

Hola nuevamente, creo que todavía no has leído esa página, a ver, para que nos entiendamos mejor, debés si o si leer sobre la vida y muerte de una variable, en uno de los ejemplos de la página que te pasé, explica exactamente lo mismo que yo te expliqué, además también hace lo mismo que yo hice, asignar una variable global dentro de la función.

Cita:
@Principe_Azul : estas equivocado..... no hay intencionalidad de pasar ninguna variable (x) como parametro a la funcion : f(x) .....
No amigo, el que está equivocado sos vos, comprende que en Python esó que vos intentás hacer está prohibido, si leyeras entenderías que eso es así.
Y si, hay que pasar parámetros dentro de la función o asignar la variable x dentro de la función como global
Tratá de comprender y entender que esto es así, no se puede trabajar de la manera que vos querés.

Cita:
En una epoca intente hacer lo mismo en el foro de PHP pero recibí bastantes agresiones de moderadores y demas usuarios......ojala aca si haya apoyo de divulgar las fallas del lenguaje para estar prevenidos ante un fallo inexplicable en nuestro
Seguís pensando que es una falla, entendé no es una falla, la falla está en vos, Python no trabaja como uno quiere, sino como lo crearon.
Este Foro es muy tranquilo y veo a personas trabajar en equipo, no creo que alguien te agreda, es más yo amablemente trato de explicarte como funciónan las variables en Python, pero no quieres pensar ni entender como es en realidad el proceso de modificación de una variable dentro de una función.

Por si no has leído la página que te pasé, te dejo una parte de la misma en donde explican que lo que vos querés hacer, está prohibido y de que manera se lo debe hacer eticamente:


Las variables globales tienen la particularidad de que también son visibles dentro de la función:


Código:
# Ejemplo 6

def cajanegra():
    c = 3
    print(a)
    print(b)
    print(c)

a = 1
b = 2
cajanegra()

>>> 
1
2
3
Sin embargo, todo intento de modificar una variable global desde dentro de una función mediante una nueva asignación fracasa, como podemos comprobar en el ejemplo 7:


Código:
# Ejemplo 7

def cajanegra():
    c = 3
    print(a)
    b = 5
    print('La variable b dentro de la función vale', b)
    print(c)

a = 1
b = 2
cajanegra()
print('La variable b fuera de la función sigue valiendo', b)

>>> 
1
La variable b dentro de la función vale 5
3
La variable b fuera de la función sigue valiendo 2
Lo importante a comprender es que, desde el preciso momento en el que una variable recibe una asignación dentro de una función, pasa a ser calificada como local. Cuando eso ocurre, la variable tiene una visibilidad limitada al cuerpo de la función y deja de ser considerada como global si ya existía el nombre en el ámbito exterior. Por eso, en el ejemplo, la variable a es global, mientras que b y c son locales.

Dentro de una función, la misma variable no puede ser en unos momentos global y en otros local. Si hay una asignación, aunque sea posterior a su uso como variable global, la variable será considerada local y se producirá un error:


Código:
# Ejemplo 8

def cajanegra():
    c = 3
    print(b)
    b = 5

a = 1
b = 2
cajanegra()

>>> 
Traceback (most recent call last):
  File "C:\Users\Javier\Dropbox\pythonprad\pruebas\probando.py", line 45, in <module>
    cajanegra()
  File "C:\Users\Javier\Dropbox\pythonprad\pruebas\probando.py", line 40, in cajanegra
    print(b)
UnboundLocalError: local variable 'b' referenced before assignment
El mensaje es concluyente: la variable b ha sido referenciada antes de haber recibido una asignación, algo prohibido en Python. Si no hubiese existido la asignación en la tercera línea del cuerpo de cajanegra(), b hubiese sido considerada una variable global y el codigo sería válido. Sin embargo, la asignación hace que b se trate como local, invalidando su rol global.

En numerosas ocasiones puede resultar conveniente no solo poder acceder a una variable global desde dentro de una función, sino poder cambiar su valor mediante una nueva asignación. Para lograr esto, hay que calificar la variable externa dentro de la función empleando la palabra global.


Código:
# Ejemplo 9

def cajanegra():
    c = 3
    global b
    b = 5
    print('Dentro de la función b vale', b)

a = 1
b = 2
cajanegra()
print('Fuera de la función b también vale', b)


>>> 
Dentro de la función b vale 5
Fuera de la función b también vale 5
Al calificar b como global dentro de la función estamos indicando que las asignaciones posteriores de esa variable se realizarán en un ámbito global en vez de local, modificando así el valor externo.

Hay que usar las variables globales con precaución. Permitir a las funciones que modifiquen nuestras variables externas es una práctica que puede dificultar la localización de errores cuando las cosas no funcionan como debieran. Sin embargo, son muy útiles para almacenar información de estado que luego podrá recuperarse al invocar nuevamente la función u otra diferente. En el ejemplo siguiente, utilizamos la variable global suma para retener el efecto de cada invocación a la función:


Código:
# Ejemplo 10

def sumar5():
    global suma
    suma = suma + 5
    print('La nueva suma es', suma)

suma = 0
sumar5()
sumar5()
sumar5()

>>> 
La nueva suma es 5
La nueva suma es 10
La nueva suma es 15
Cada invocación a sumar5() agrega cinco al valor de suma. La variable suma ha sido declarada como global dentro de la función para poder actualizar el valor externo, que será utilizado nuevamente al volver a llamar a la función.

---- Info extraída de http://elclubdelautodidacta.es/wp/20...-una-variable/ ----

Bueno compañero Italico, he sido lo más amable y te he tratado de explicar lo mejor posible, te he puesto la página en donde explican porque da error lo que vos intentás hacer y que eso está prohibido en Python, también te explican como hacerlo de manera correcta, además te he puesto la explicación aquí mismo y hasta con códigos de ejemplos que se observa en esa web.

Yo sólo intento ayudarte de la mejor manera, este un Foro para ayudarnos entre todos, he puesto mi granito de arena.

Que tengas buenas tardes.

Última edición por Principe_Azul; 21/04/2014 a las 15:30
  #8 (permalink)  
Antiguo 21/04/2014, 16:36
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Bugs y errores de diseño del lenguaje Python

OFFTOPIC:

@Principe_Azul : que lastima se ha desvirtuado el tema........pero ya que estamos...... te hago una sola pregunta..... donde se ha declarado L como variable global en el codigo que deje ?

Voy a leer con tiempo todas tus respuestas......gracias
__________________
Salu2!
  #9 (permalink)  
Antiguo 21/04/2014, 17:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Bugs y errores de diseño del lenguaje Python

No es un bug, es completamente normal. Pero para entender eso necesitas entender como funcionan los objetos y funciones en python.

Material:
http://stackoverflow.com/questions/1...lt-argument-in

http://effbot.org/zone/default-values.htm
  #10 (permalink)  
Antiguo 21/04/2014, 18:00
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Bugs y errores de diseño del lenguaje Python

Emmm...si... estoy viendo que..... la definicion de "local" y "global" cambia por completo respecto de por ejemplo PHP:

Código PHP:
Ver original
  1. <?php
  2.  
  3. function cajanegra()
  4. {
  5.     $c = 3;
  6.     print($a);
  7.     print($b);
  8.     print($c); 
  9. }  
  10.  
  11. $a = 1;
  12. $b = 2;
  13. cajanegra();
  14.  
  15. /*
  16. Notice: Undefined variable: a in C:\xampp\htdocs\pruebas\test.php on line 6
  17.  
  18. Notice: Undefined variable: b in C:\xampp\htdocs\pruebas\test.php on line 7
  19. 3
  20. */

Alla.... se es local local dentro de una funcion..... y se es global si se declara explicitamente dentro de la funcion como global

Gracias...... me hacia falta que me dieran unas cuantas cachetadas para despertar :P

---
Lo que si.... me parece que Python viola el principio de encapsulamiento:

Código Python:
Ver original
  1. # Ejemplo 8
  2.  
  3. def cajanegra():
  4.     c = 3
  5.     print(b)
  6.     b = 5
  7.  
  8. a = 1
  9. b = 2
  10. cajanegra()

No veo como las variables dentro de una funcion no puede llevar cualquier nombre incluso el mismo que el de variables "globales"... creo hubiera sido preferible que ese caso... automaticamente se conviertieran en locales (dejaran de ser globales) sin mas conflictos.... al menos en otros lenguajes interpretados no hay problemas de resolucion como aca de graves.
__________________
Salu2!

Última edición por Italico76; 21/04/2014 a las 18:16
  #11 (permalink)  
Antiguo 21/04/2014, 18:56
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bugs y errores de diseño del lenguaje Python

Italico, el tema en ningún momento se ha desvirtuado, te he contestado exactamente y de la manera correcta y educada lo que necesitás saber, pero a vos no te agrada como trabaja Python, para vos esto un es problema grave.
Y en realidad no lo es, es lógica del lenguaje.
Disculpame pero pareciera ser que tenés algún problema de aprendizaje, de comprensión o de capricho, porque me decís OFFTOPIC, eso me parece de mala educación, te di una buena ayuda y me saltás con algo así.
Te puse ejemplos, te compartí una página, te expliqué y bue...

Cita:
Código PHP:

<?php

function cajanegra()
{
$c = 3;
print($a);
print($b);
print($c);
}

$a = 1;
$b = 2;
cajanegra();

/*
Notice: Undefined variable: a in C:\xampp\htdocs\pruebas\test.php on line 6

Notice: Undefined variable: b in C:\xampp\htdocs\pruebas\test.php on line 7
3
*/
Por cierto, este es un Foro de Python, no de PHP, Python no tiene nada que ver con PHP, son dos lenguajes diferentes.
No tiene sentido un código en otro lenguaje, vos querés ayuda sobre Python, no sobre PHP.

Igual todo bien.

Última edición por Principe_Azul; 21/04/2014 a las 19:22
  #12 (permalink)  
Antiguo 21/04/2014, 19:45
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años
Puntos: 292
Respuesta: Bugs y errores de diseño del lenguaje Python

@Principe_Azul : compa... le he agradecido implicitamente con cada punto de karma que le entregado en cada mensaje suyo........

Ud tiene razon....y yo estaba equivocado en varias cosas..... lo cierto es que no me convence del todo el diseño del lenguaje..... seguramente es muy sobervio de alguien que no tiene tanto conocimiento del mismo pero es cuestion de que deberia ser mas predecible y mi profundo desconocimiento me hace ver esas cosas asi.

Seguire estudiando..... no me quiero dar por vencido...... el lenguaje tiene cosas que me han gustado mucho...... es cuestion de adaptarme a las que no.


Por otro lado.... y viendo que Ud es una persona generosa y paciente [aun no me ha insultado ja] ... voy a cometer una infraccion y voy a pedirle si puede mirar el otro hilo donde no entiendo que pasa con ese script simple ... gracias!

Saludos..... y... espero pronto entender Python!
__________________
Salu2!
  #13 (permalink)  
Antiguo 22/04/2014, 03:25
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Bugs y errores de diseño del lenguaje Python

Amigo Italico, todos estamos para ayudarnos, yo soy novato en Python y también hay cosas que no quisiera que sean así en el lenguaje, pero así lo crearon por alguna razón; y me he adaptado al lenguaje para poder entenderle como funciona.
A mi me encanta Python, desde siempre me gustó, también me gusta mucho C++!!

Te agradezco por tus puntos, gracias.

Yo te voy a dar una mano siempre y cuando sepa, te ayudaría en el otro Tema, pero no se nada de Django, se un poco de wxPython, en eso podría ayudarte (si es que es algo que lo sepa), pero con diseño web soy muy malo, no se ni de html.

Me alegro que hayas podido comprender como trabaja Python!!

Y si esperamos que aprendás, como yo también espero aprender más!!!

Nos vemos campeón!! Un abrazo!!!

Etiquetas: bugs, diseño, errores, lenguaje
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.