[pyar] [Consulta]Programación: constante

Angel Java Lopez ajlopez2000 en gmail.com
Dom Mar 4 21:16:35 ART 2012


Hola gente!

Interesantisimo, John! Me habia confundido leer que alguna parte que se
podia cambiar True, False, y luego que no. Tengo que ir aprendiendo las
diferencias de 2.x a 3.x

Luego de buscar, leer por aqui, en este thread, y en otros lados, arriesgo
esta explicacion:

- No hay constantes en Python, por ser un lenguaje dinamico, como Ruby,
Javascript y otros, donde el compilador/interprete no puede detectar ANTES
DE RUNTIME, si ONE = 2 es valido o no, habiendo sido declarada ONE como
constante en otro lado

- Y la deteccion en RUNTIME es (o por lo menos, me parece a mi) costosa

Cualquier interprete o compilador veria afectada su implementacion si
tuviera que chequear a cada rato

ONE = 2

si esta asignacion es valida o no. Se puede hacer en ejecucion el control,
pero probablemente (dependiendo de la implementacion interna, mas alla de
alias o no alias, vean que el problema es el mismo con alias o sin alias)
seria costosa en tiempo o en espacio, solo para tener soporte del tema de
constantes.

Por ejemplo, se me ocurren formas de implementar, aun con diccionarios como
menciona John, que una entrada en particular sea asignable solo una vez.
Pero todas las formas que imagino son costosas en ejecucion.

Algun lenguaje dinamico (p.ej., donde la validez de x.y, x.y(), x.y = 2,
ONE = 2 se deciden en runtime) con soporte de constantes definidas por el
programador? No encontre ninguno, hay?

Un ejemplo y discusion de Ruby:
http://rubylearning.com/satishtalim/ruby_constants.html
donde hay constantes, pero su cambio es permitido, aunque da warning (en
ejecucion hasta donde se). Vean ahi, como el no ser inmutables los string
en Ruby, tiene menos sentido tener "constantes" string.
Parece que los implementadores de Ruby podrian haber tomado: todo lo que
comienza con mayusculas es constante. Y algo asi hicieron. PERO, lo que se
les complico NO ES:
ONE = 1
Intuyo que lo que SE LES COMPLICA es detectar, en cualquier parte que:
ONE = 2
"deberia" ser rechazada por estar ya definida ONE = 1 en otro lado.
Notablemente, Ruby rechaza
def foo()
CONST =3
end
por razones totalmente distintas ;-)

Hmmm... la unica forma que se me ocurre de tener constantes, en un lenguaje
dinamico, es que soporte preprocesador, como en C (o ya que estamos, onda
compiladores en el recuerdo, como en WATFOR ;-)

#define ONE 1

y que sea el parser el que traduzca cualquier

ONE = 2

a

1 = 2

y entonces el compilador, que no ve "ONE = 2" sino el preprocesado "1 = 2",
diga error, invalid left expression o algo asi.

Gracias a todos por tan interesante tema y discusion.

Nos leemos!

Angel "Java" Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez



2012/3/4 John Rowland Lenton <john.lenton en canonical.com>

> On Sun, 4 Mar 2012 18:18:31 -0300, Diva Satanica <apokalyptica79 en gmail.com>
> wrote:
> > porque no existe la constante en python?
>
> 無. Mu. Tu pregunta tiene adentro de ella misma suposiciones erróneas
> que hacen que la pregunta no tenga respuesta.
>
> En Python, hay objetos que no se pueden cambiar (son inmutables), pero
> la asignación de nombres a objetos es completamente dinámica. Un nombre
> en un espacio de nombres no es ni más ni menos que una entrada en un
> diccionario particular. Osea, lo que vos querés, no tiene sentido en
> Python. Osea, no, no existen. Fin de la respuesta.
>
>
>
>
>
> .
> .
> .
>
>
> Pero...
> ... te las podés fabricar.
>
> Fijate que no todos los nombres son iguales:
>
> >>> None = 42
>  File "<console>", line 1
> SyntaxError: assignment to keyword
> >>> True, False = False, True
>  File "<console>", line 1
> SyntaxError: assignment to keyword
> >>>
>
> entonces lo único que tenés que hacer para tener una constante, es
> decirle al parser como palabra clave.
>
> Para que quede claro: eso es un hack, una chanchada, metida para que la
> gente no mande moco. Ni None, ni True ni False son palabras clave; son
> instancias de clases comunes y corrientes (bueno, más o menos; None no
> la podrías implementar en python "puro", pero desde más abajo es
> refácil). Ni siquiera todas las “constantes” de las tripas de Python
> gozan de este beneficio; hasta hace poco (Python 2.4? por ahí) podías
> asignar a cualquiera de estos valores lo que se te ocurriera, y
> funcionaba. La asignación a True y False todavía funciona en Python 2.7;
> hay mucho código python viejo dando vuelta que empieza con
>
>  True, False = 1, 0
>
> porque True y False no eran parte de Python, antes. Ni a NotImplemented
> ni a Ellipsis las protege nadie, pobrecitas.
>
> Así que, bueno, podés. Suerte con eso.
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120304/62fcd07f/attachment.html>


More information about the pyar mailing list