[pyar] [Consulta]Programación: constante

Ricardo Araoz ricaraoz en gmail.com
Dom Mar 4 21:40:46 ART 2012


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).





More information about the pyar mailing list