En Python, ¿existe un análogo de la C
declaración del preprocesador como ?:
#define MY_CONSTANT 50
Además, tengo una gran lista de constantes que me gustaría importar a varias clases. ¿Existe un análogo de declarar las constantes como una secuencia larga de declaraciones como la anterior en un .py
archivo e importarlas a otro .py
archivo?
Editar.
El archivo Constants.py
dice:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
Y myExample.py
lee:
#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""
import sys
import os
import Constants
class myExample:
def __init__(self):
self.someValueOne = Constants.MY_CONSTANT_ONE + 1
self.someValueTwo = Constants.MY_CONSTANT_TWO + 1
if __name__ == '__main__':
x = MyClass()
Editar.
Desde el compilador,
NameError: "el nombre global 'MY_CONSTANT_ONE' no está definido"
función init en myExample en la línea 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copia de salida El programa salió con el código # 1 después de 0.06 segundos.
python myExample.py
debe dar un seguimiento del error que incluya nombres de archivos y<module>
como nivel superior. Además,MY_CONSTANT_ONE
no son referencias como nombre global, realmente extraño. Verifique tres veces que esos son realmente los archivos que está ejecutando (y quizás conviértalos a ASCII y elimine el# encoding: utf8
bit).Respuestas:
Python no está preprocesado. Simplemente puede crear un archivo
myconstants.py
:MY_CONSTANT = 50
E importarlos simplemente funcionará:
import myconstants print myconstants.MY_CONSTANT * 2
fuente
MAX_FIVE_FLUSH_KEY_INT
). Publique el rastreo.Python no tiene un preprocesador, ni tiene constantes en el sentido de que no se pueden cambiar; siempre puede cambiar (casi, puede emular las propiedades de los objetos constantes, pero hacer esto por el bien de la constancia rara vez es hecho y no considerado útil) todo. Al definir una constante, definimos un nombre que está en mayúsculas con guiones bajos y lo llamamos un día: "Aquí todos somos adultos que consienten", ningún hombre en su sano juicio cambiaría una constante. A menos que, por supuesto, tenga muy buenas razones y sepa exactamente lo que está haciendo, en cuyo caso no puedes (y probablemente no deberías) detenerlo de cualquier manera.
Pero, por supuesto, puede definir un nombre de nivel de módulo con un valor y usarlo en otro módulo. Esto no es específico de las constantes ni nada, lea sobre el sistema del módulo.
# a.py MY_CONSTANT = ... # b.py import a print a.MY_CONSTANT
fuente
Y por supuesto puedes hacer:
# a.py MY_CONSTANT = ... # b.py from a import * print MY_CONSTANT
fuente
import *
es del diablo.Claro, puede poner sus constantes en un módulo separado. Por ejemplo:
const.py:
A = 12 B = 'abc' C = 1.2
main.py:
import const print const.A, const.B, const.C
Tenga en cuenta que según lo declarado anteriormente,
A
,B
yC
son variables, es decir, se pueden cambiar en tiempo de ejecución.fuente
Trate de buscar ¿ Crear constantes usando un módulo de "configuración"? y ¿Puedo evitar modificar un objeto en Python?
Otro enlace útil: http://code.activestate.com/recipes/65207-constants-in-python/ nos informa sobre la siguiente opción:
from copy import deepcopy class const(object): def __setattr__(self, name, value): if self.__dict__.has_key(name): print 'NO WAY this is a const' # put here anything you want(throw exc and etc) return deepcopy(self.__dict__[name]) self.__dict__[name] = value def __getattr__(self, name, value): if self.__dict__.has_key(name): return deepcopy(self.__dict__[name]) def __delattr__(self, item): if self.__dict__.has_key(item): print 'NOOOOO' # throw exception if needed CONST = const() CONST.Constant1 = 111 CONST.Constant1 = 12 print a.Constant1 # 111 CONST.Constant2 = 'tst' CONST.Constant2 = 'tst1' print a.Constant2 # 'tst'
Entonces podría crear una clase como esta y luego importarla desde su módulo contants.py. Esto le permitirá estar seguro de que el valor no se modificará ni se eliminará.
fuente
Como alternativa al uso del enfoque de importación descrito en varias respuestas, eche un vistazo al módulo configparser .
La clase ConfigParser implementa un lenguaje de análisis de archivos de configuración básico que proporciona una estructura similar a la que encontraría en los archivos INI de Microsoft Windows. Puede usar esto para escribir programas Python que los usuarios finales pueden personalizar fácilmente.
fuente
Si realmente desea constantes, no solo variables que parezcan constantes, la forma estándar de hacerlo es utilizar diccionarios inmutables. Desafortunadamente, aún no está integrado, por lo que debe usar recetas de terceros (como esta o aquella ).
fuente
crear un archivo constante con cualquier nombre como my_constants.py declarar constante así
CONSTANT_NAME = "SOME VALUE"
Para acceder a la constante en su archivo de importación de código como ese
import my_constants as constant
y acceda al valor constante como -
fuente