standard imports functions python const const-correctness

imports - ¿Por qué no hay ''const'' en Python?



pep8 python 3 (2)

Vengo de fondo C y estoy aprendiendo Python. La falta de seguridad explícita de tipos es perturbadora, pero me estoy acostumbrando. La falta de programación basada en contratos (clases abstractas puras, interfaces) es algo a lo que hay que acostumbrarse, ante todas las ventajas de un lenguaje dinámico.

Sin embargo, la incapacidad de solicitar constreñimiento me está volviendo loco. ¿Por qué no hay constantes en Python? ¿Por qué se desaniman las constantes de nivel de clase ?


C y Python pertenecen a dos clases diferentes de idiomas.

El primero está tipificado estáticamente . Este último es dinámico .

En un lenguaje de tipo estático, el comprobador de tipos puede inferir el tipo de cada expresión y verificar si coincide con la declaración dada durante la fase de "compilación".

En un lenguaje de tipo dinámico, la información de tipo requerida no está disponible hasta el tiempo de ejecución. Y el tipo de una expresión puede variar de una ejecución a otra. Por supuesto, podría agregar la verificación de tipos durante la ejecución del programa. Esta no es la elección hecha en Python. Esto tiene la ventaja de permitir "escribir pato". El inconveniente es que el intérprete no puede verificar la corrección del tipo.

Con respecto a la palabra clave const . Este es un modificador de tipo . Restricción del uso permitido de una variable (y, en ocasiones, modificación de la optimización permitida del compilador). Parece bastante ineficiente comprobar que en tiempo de ejecución para un lenguaje dinámico. En el primer análisis, eso implicaría verificar si una variable es constante o no para cada afectación. Esto podría optimizarse, pero aun así, ¿vale la pena el beneficio?

Más allá de los aspectos técnicos, no olvide que cada idioma tiene su propia filosofía. En Python, la opción habitual es favorecer "convención" en lugar de "restricción". Como ejemplo, la constante debe escribirse en mayúsculas. No hay ninguna aplicación técnica de eso. Es sólo una convención. Si lo sigues, tu programa se comportará como lo esperan "otros programadores". Si decides modificar una "constante", Python no se quejará. Pero debes sentir que estás haciendo "algo mal". Rompes una convención. Tal vez usted tiene sus razones para hacerlo. Tal vez no deberías haberlo hecho. Tu responsabilidad.

Como nota final, en lenguajes dinámicos, la "corrección" de un programa es mucho más responsabilidad de sus pruebas de unidad que en la mano del compilador. Si realmente tiene dificultades para dar el paso, encontrará algunos "verificadores de códigos". Esos son PyLint , PyChecker , PyFlakes ...


No sé por qué se tomó esta decisión de diseño, pero mi opinión personal es que no hay una palabra clave const explícita porque los beneficios clave de las constantes ya están disponibles:

  • Las constantes son buenas para fines de documentación. Si ves una constante, sabes que no puedes cambiarla. Esto también es posible nombrando convenciones.

  • Las constantes son útiles para llamadas a funciones. Si pasa una constante como parámetro a una función, puede estar seguro de que no se cambia. En Python, las funciones son "llamada por valor", pero como las variables de python son referencias, usted pasa una copia de una referencia. Dentro de la función puede mutar la referencia, pero si la reasigna, los cambios no se mantienen fuera del alcance de la función. Por lo tanto, si pasa un número como variable, en realidad se pasa "como" una constante. Puede asignar un nuevo valor a la variable. Pero fuera de la función, todavía tienes el número anterior

Además, si hubiera una palabra clave const, se crearía una asimetría: las variables se declaran sin palabra clave pero las consts se declaran con una palabra clave. La consecuencia lógica sería crear una segunda palabra clave llamada var. Esto es probablemente una cuestión de gusto. Personalmente prefiero el enfoque minimalista a las declaraciones de variables.

Probablemente pueda lograr un poco más de seguridad de tipo, si trabaja con estructuras de datos inmutables como tuplas. Tenga cuidado sin embargo, la tupla en sí no puede ser modificada. Pero si contiene referencias a objetos mutables, estos aún son mutables incluso si pertenecen a una tupla.

Por último, es posible que desee echar un vistazo a este fragmento: http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991 No estoy seguro de si esta es una implementación de " constantes de nivel de clase ". Pero pensé que podría ser útil.