80 votes

Créer des constantes à l'aide d'un module "paramètres" ?

Je suis relativement novice en matière de Python. Je cherche à créer un module "settings" où seront stockées diverses constantes spécifiques à une application.

Voici comment je veux configurer mon code :

paramètres.py

CONSTANT = 'value'

script.py

import settings

def func():
    var = CONSTANT
    # do some more coding
    return var

Je reçois une erreur Python qui dit :

global name 'CONSTANT' is not defined.

J'ai remarqué sur le code source de Django leur settings.py a des constantes nommées comme moi. Je ne sais pas comment les importer dans un script et les référencer dans l'application.

EDIT

Merci pour toutes vos réponses ! J'ai essayé ce qui suit :

import settings

print settings.CONSTANT

Je reçois la même erreur

ImportError: cannot import name CONSTANT

5 votes

Cela n'a pas de sens. Vous devriez recevoir un AttributeError si settings ne définit pas CONSTANT et un ImportError s'il ne peut pas importer les paramètres, auquel cas il ne regarderait même pas à CONSTANT

0 votes

Est-ce que je fais quelque chose de mal alors ?

1 votes

Mettez les deux lignes que vous avez postées en dernier dans un fichier par lui-même exactement comme vous les avez postées et voyez si cela fonctionne.

144voto

aaronasterling Points 25749

La façon la plus simple de le faire est de faire des paramètres un module.

(settings.py)

CONSTANT1 = "value1"
CONSTANT2 = "value2"

(consumer.py)

import settings

print settings.CONSTANT1
print settings.CONSTANT2

Lorsque vous importez un module python, vous devez faire précéder les variables que vous en tirez du nom du module. Si vous savez exactement quelles valeurs vous voulez utiliser dans un fichier donné, vous pouvez utiliser le nom du module. y si vous ne craignez pas qu'ils changent pendant l'exécution, vous pouvez faire ce qui suit

from settings import CONSTANT1, CONSTANT2

print CONSTANT1
print CONSTANT2

mais je ne me laisserais pas emporter par ce dernier point. Il est difficile pour les personnes qui lisent votre code de savoir d'où viennent les valeurs. et empêche ces valeurs d'être mises à jour si un autre module client les modifie. Une dernière façon de faire est

import settings as s

print s.CONSTANT1
print s.CONSTANT2

Cela vous évite de taper, propage les mises à jour et oblige seulement les lecteurs à se rappeler que tout ce qui suit s provient du module de paramétrage.

0 votes

@delnan J'ai spécifiquement évité de mentionner la mécanique afin de ne pas rendre votre réponse obsolète ;)

0 votes

Eh bien, pratiquement obsolète ;) Connaître la sémantique exacte est utile et préférable, mais pour que cela fonctionne, ce n'est pas nécessaire - bien qu'il soit nécessaire de connaître ses implications, qui sont assez bien résumées dans votre réponse.

3 votes

Je pensais que l'idée d'une constante était qu'elle ne pouvait pas être modifiée au moment de l'exécution ?

18voto

Fady Faried Points 81

étape 1 : créez un nouveau fichier settings.py dans le même répertoire pour un accès plus facile.

#database configuration settings

database = dict(
    DATABASE = "mysql",
    USER     = "Lark",
    PASS     = ""
)

#application predefined constants

app = dict(
    VERSION   = 1.0,
    GITHUB    = "{url}"
)

étape 2 : importation du module de paramétrage dans votre fichier d'application.

import settings as s            # s is aliasing settings & settings is the actual file you do not have to add .py 

print(s.database['DATABASE'])   # should output mysql

print(s.app['VERSION'])         # should output 1.0

si vous n'aimez pas utiliser des alias comme s vous pouvez utiliser un syntaxe différente

from settings import database, app

print(database['DATABASE'])   # should output mysql

print(app['VERSION'])         # should output 1.0

remarquez que dans la deuxième méthode d'importation, vous pouvez utiliser directement les noms des dictateurs.

Un petit conseil vous pouvez importer tout le code sur le fichier de configuration en utilisant * dans le cas où vous avez un gros fichier et que vous utiliserez la plupart des paramètres de celui-ci dans votre application.

from settings import *      # * represent all the code on the file, it will work like step 2

print(database['USER'])       # should output lark

print(app['VERSION'])         # should output 1.0

J'espère que cela vous aidera.

5voto

delnan Points 52260

Quand vous import settings , a module objet appelé settings est placé dans l'espace de nom global - et cet objet porte ce qui était dans l'espace de nom global. settings.py en tant qu'attributs. C'est-à-dire qu'en dehors de settings.py vous vous référez à CONSTANT como settings.CONSTANT .

4voto

Ned Batchelder Points 128913

Laissez votre settings.py exactement comme il est, vous pourrez alors l'utiliser comme le fait Django :

import settings

def func():
    var = settings.CONSTANT

3voto

ewall Points 10676

...Ou, si vous realmente Si vous voulez que toutes les constantes de settings.py soient importées dans l'espace de noms global, vous pouvez exécuter la commande suivante

from settings import *

...mais autrement en utilisant settings.CONSTANT comme tout le monde l'a dit ici, a tout à fait raison.

0 votes

Voir ma réponse pour les trois façons possibles d'utiliser l'option import déclaration.

2 votes

En fait, ce n'est pas conseillé. Voir par exemple docs.python.org/howto/doanddont.html#from-module-import . Bien que, dans ce cas, cela ait l'effet secondaire proprement souhaitable que les modifications apportées aux constantes n'affectent pas les autres modules.

2 votes

Bien dit, @AaronMcSmooth. Et techniquement, je n'ai pas dit qu'il était conseillé d'importer *, juste que c'était possible :P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X