En Python, existe-t-il un analogue de l’instruction de préprocesseur C
telle que ?:
#define MY_CONSTANT 50
En outre, j'ai une grande liste de constantes que je voudrais importer dans plusieurs classes. Existe-t-il un analogue consistant à déclarer les constantes sous la forme d'une longue séquence d'instructions comme celle ci-dessus dans un .py
fichier et l’importer dans un autre .py
fichier?
Modifier.
Le fichier Constants.py
lit:
#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""
MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51
Et myExample.py
lit:
#!/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 __== '__main__':
x = MyClass()
Modifier.
Du compilateur,
NameError: "le nom global 'MY_CONSTANT_ONE' n'est pas défini"
function init dans myExample à la ligne 13 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copie du programme Exit avec le code n ° 1 après 0,06 seconde.
Python n'est pas prétraité. Vous pouvez simplement créer un fichier myconstants.py
:
MY_CONSTANT = 50
Et les importer ne fonctionnera que:
import myconstants
print myconstants.MY_CONSTANT * 2
Python n'a pas de préprocesseur, pas plus que de constantes en ce sens qu'elles ne peuvent pas être changées - vous pouvez toujours changer (presque, vous pouvez émuler des propriétés d'objet constantes, mais le faire dans un souci de constance est rarement fait et non considéré utile) tout. Lorsque nous définissons une constante, nous définissons un nom majuscule avec des tirets bas et appelons cela un jour - "Nous sommes tous des adultes consentants ici", aucun homme sensé ne changerait une constante. À moins bien sûr qu'il ait de très bonnes raisons et qu'il sache exactement ce qu'il fait, dans ce cas, vous ne pouvez pas (et ne devriez probablement pas) l'arrêter de toute façon.
Mais bien sûr, vous pouvez définir un nom de niveau module avec une valeur et l’utiliser dans un autre module. Ce n'est pas spécifique aux constantes ou quoi que ce soit, lisez sur le système de module.
# a.py
MY_CONSTANT = ...
# b.py
import a
print a.MY_CONSTANT
Et bien sûr, vous pouvez faire:
# a.py
MY_CONSTANT = ...
# b.py
from a import *
print MY_CONSTANT
Bien sûr, vous pouvez mettre vos constantes dans un module séparé. Par exemple:
const.py:
A = 12
B = 'abc'
C = 1.2
main.py:
import const
print const.A, const.B, const.C
Notez que comme indiqué ci-dessus, A
, B
et C
sont des variables, c’est-à-dire qu’elles peuvent être modifiées au moment de l’exécution.
Essayez de regarder Créer des constantes en utilisant un module "paramètres"? et Puis-je empêcher la modification d'un objet en Python?
Un autre lien utile: http://code.activestate.com/recipes/65207-constants-in-python/ nous parle de l'option suivante:
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'
Vous pouvez donc créer une classe comme celle-ci et l'importer à partir de votre module contants.py. Cela vous permettra de vous assurer que cette valeur ne sera pas modifiée, supprimée.
Au lieu d'utiliser l'approche d'importation décrite dans plusieurs réponses, consultez le module configparser .
La classe ConfigParser implémente un langage d'analyse de fichier de configuration de base qui fournit une structure similaire à celle que vous trouverez sur les fichiers Microsoft Windows INI. Vous pouvez l'utiliser pour écrire Python = programmes pouvant être personnalisés facilement par les utilisateurs finaux.