[pyar] [Consulta]Programación: constante

Angel Java Lopez ajlopez2000 en gmail.com
Lun Mar 5 06:44:27 ART 2012


Hola gente!

Vayamos al uso en el dia a dia.

Yo distingo dos casos: constantes definidas por otros, y constantes
definidas por el programador que esta construyendo algo.

El primer caso me parece el mas frecuente. Como comentaron en este thread,
el caso clasico es pi. En Java, esta un Math.PI, es mas, el valor que tiene
que devolver esta sujeto a una especificacion de Java, y hasta esta
definido que tiene que devolver Math.sin(x) y demas, para que una
implementacion de Java se considere una implementacion correcta de Java.

El de constantes definidas por el programador/equipo, tiene dos vertientes.
La primera, es para mi, mas rara: definir constantes como PI, con un valor
que importa en la ejecucion. A no ser que uno comience un paquete
matematico con nuevas constantes, o alguna libreria con strings magicos,
puestos como constantes, no lo vi usado mucho ultimamente.

Otro uso de constantes por el programador/equipo, es mas corriente. Es
simplemente para recordar algunas cosas mejor, tipo en una maquina de
estado recordar los estados de algo de mejor forma:

PENDING = 0
OPENED = 1
CLOSED = 2
....

Ahora bien, todo el codigo se escribe SIN IMPORTAR que luego eso valores se
cambien. El programa sigue funcionando si luego alguien pone:

PENDING = 1
OPENED = 2
CLOSED = 3
....

(por supuesto, estamos hablando de un programa en memoria, donde no se
hayan serializado/deserializado esos valores en otro lado, disco, base de
datos, etc...)

O en juego de tablero, recordar los colores de los jugadores:

WHITE = 0
BLACK = 1

Eso, desde hace unas decadas, se resuelve en otros lenguajes, con enums. O
en Ruby, Smalltalk, con simbolos.

Hay enum en Python? Y simbolos?

Nos leemos!

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





2012/3/4 Ricardo Araoz <ricaraoz en gmail.com>

> El 04/03/12 21:16, Angel Java Lopez escribió:
> > 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.
> >
>
> De todas maneras y sin ánimo de ofender, hay que preguntarse para qué
> quiero dicha constante.
> Si la razón es impedirme a mí mismo el modificar mi propia constante,
> entonces lo mejor es ir al psicólogo.
> Si la razón es que estoy haciendo un script que puede ser llamado desde
> otro lado donde podrían haber redefinido el nombre que uso entonces lo
> mejor es utilizar las convenciones de python y usar _UNO o también __UNO.
> Si la razón es que quiero que se parezca más a lo que estoy acostumbrado
> a usar entonces lo mejor es usar Java, que es lo más parecido a Java que
> puedo encontrar (reemplazar "Java" por "C++", "C#", o lo que sea).
>
>
> _______________________________________________
> 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/20120305/27f73ac4/attachment.html>


More information about the pyar mailing list