2012-06-20 16 views
25

Usuario por primera vez en desbordamiento de pila y estoy emocionado de estar aquí.Python - Mejor/Más limpia manera de definir listas constantes o diccionarios

INTRO: Recientemente comencé la aventura mágica en el mundo de la programación Python - Me encanta. Ahora todo ha ido bien en mi incómoda transición de C, pero estoy teniendo problemas para crear algo que también sería un archivo HEADER (.h).

PROBLEMA: Tengo diccionarios y listas de tamaño medio (alrededor de 1000 elementos), largas enumeraciones y '#defines' (bueno, en realidad no), pero no puedo encontrar una manera LIMPIA de organizarlos todos. En C, los arrojaría a todos en un archivo de cabecera y nunca más volvería a pensar en ello, sin embargo, en Python eso no es posible o eso creo.

SOLUCIÓN ACTUAL SUCIA: Estoy inicializando todas las variables CONSTANTES en la parte superior del MÓDULO o FUNCIÓN (módulo si las funciones múltiples lo necesitan).

CONCLUSIÓN: Estaría eternamente agradecido si alguien hubiera encontrado una forma de organizar CLEANLY variables constantes.

¡MUCHAS GRACIAS!

+6

Solo quería decir, bienvenido a Stack, ¡y gracias por comenzar aquí con una pregunta bien organizada! – jdi

Respuesta

19

Ponga sus constantes en su propio módulo:

# constants.py 

RED = 1 
BLUE = 2 
GREEN = 3 

A continuación, importar ese módulo y utilizar las constantes:

import constants 

print "RED is", constants.RED 

Las constantes pueden ser cualquier valor que te gusta, he mostrado aquí enteros , pero las listas y los dictados funcionarían de la misma manera.

+0

Gran idea. ¿Sabes cómo es la latencia o la pérdida de eficiencia? ¿Porque técnicamente lo está importando y no requiere una búsqueda cada vez que hace referencia al valor? – TSmith

+0

Usted está haciendo una búsqueda de atributos cada vez, que es el tipo de operación que ocurre todo el tiempo de todos modos, realmente no es algo de lo que preocuparse. –

+1

@TSmith: Y si está muy preocupado por perder ese poco de tiempo, siempre puede hacer 'from constants import RED', o asignarlo a una variable justo antes de un bucle súper largo:' red = constants.ROJO' – jdi

9

Por lo general hacer esto:

del archivo: constants.py

CONSTANT1 = 'asd' 
CONSTANT_FOO = 123 
CONSTANT_BAR = [1, 2, 5] 

del archivo: your_script.py

from constants import CONSTANT1, CONSTANT_FOO 
# or if you want *all* of them 
# from constants import * 

... 

Ahora sus constantes están en un archivo y se puede importarlos y usarlos muy bien

+0

Gracias, CC'ing a la pregunta de eficiencia si puede ayudar. – TSmith

+0

Si los importa todos, las constantes se convierten en variables globales y no requerirán una búsqueda. Ten en cuenta que Python es unas 200 veces más lento que C, por lo que no notarás un gran aumento de velocidad si tratas de optimizarlo. – Blender

+0

Gracias licuadora. Pregunta de curiosidad rápida, si asigno una variable local (dentro de una función) a esa variable global importada, ¿esa var local tendrá una copia o una referencia a lo global? – TSmith

2

Haga un archivo separado constants.py y coloque todas las constantes relevantes a nivel mundial allí. Entonces puede import constants para referirse a ellos como constants.SPAM o hacer el (cuestionable) from constants import * para referirse a ellos simplemente como SPAM o EGGS.

Mientras estamos aquí, tenga en cuenta que Python no admite las constantes constantes. La convención es solo para nombrarlos en ALL_CAPS y prometen no mutarlos.

+0

Jaja, sí lo prometo :), pero ¿qué pasa con la eficiencia de tiempo de ejecución? Cuando importas un módulo es como "__inline" en C? – TSmith

+0

@TSmith: No lo compararía con un en línea porque solo importa en un objeto de módulo de espacio de nombres, y lo hace solo una vez, y lo comparte en la memoria para las importaciones posteriores. – jdi

+0

Sí, esa era una pregunta tonta ahora que lo pienso. ¡Gracias y que tengas un buen día! – TSmith

Cuestiones relacionadas