2010-10-28 31 views
9

Je voudrais utiliser à la fois l'interpolation de l'analyse et de l'exécution pour les valeurs d'un fichier de configuration configobj. La méthode la plus simple pour effectuer une interpolation de chaîne simple en Python est "%(foo)s" % somedict. Malheureusement, configobj utilise le même mécanisme d'interpolation et je n'ai pas encore trouvé le moyen d'y échapper. Idéalement, ma valeur ressemblerait à:Comment faire pour échapper un signe% dans une valeur configobj?

othervar = foo 
someconfigobjkey = %(othervar)s %%(runtimevar)s 

Toutefois, configobj essaie (et échoue) de remplacer la deuxième variable. Une autre façon de répondre à cette question est de fournir une manière différente (configobj) de faire à la fois l'interpolation du temps d'analyse et celle de l'exécution.

Répondre

1

Nouvelle version de la réponse:

Vous pouvez utiliser "" .format() (Python 2.6 ou supérieur) ou string.Template (Python 2.4 ou ci-dessus) pour l'interpolation d'exécution - les deux qui éliminerait le conflit.

(L'ancienne version suppose l'utilisation du module standard ConfigParser, d'où les commentaires.)

+0

Comme je l'ai dit dans ma question initiale, j'utilise configobj et non ConfigParser.J'ai peut-être supposé que ce module soit connu trop loin de toute façon, il peut être trouvé à http://www.voidspace.org.uk/python/configobj.html –

+0

Alors Je ne connaissais pas ce module et je ne l'ai pas reconnu comme un nom de module dans votre message. Une raison pour ne pas utiliser simplement le module ConfigParser standard?Si cela vous convient également, le problème sera également résolu :) –

+0

En développement d'entreprise, le choix des outils n'est pas toujours donné. –

3

Oui, malheureusement configobj ne suit pas les règles de formatage normales Python standard, donc %%, qui seraient autrement la bonne façon échapper un signe de pourcentage, échoue. Cela me semble un peu un défaut de conception.

La seule façon que je peux penser à avoir une séquence %(foo)s littérale dans une valeur configobj serait d'assurer une partie de cette séquence elle-même est générée par un remplacement:

>>> import configobj 
>>> c= configobject.ConfigObj() 
>>> c['foo']= 'bar' 
>>> c['pc']= '%' 
>>> c['v']= '%(foo)s %(pc)s(foo)s' 
>>> c['v'] 
'bar %(foo)s' 
2

Creuser plus profondément dans la documentation que j'ai trouvé une solution qui correspond mieux que celle proposée par Bobince: Utilisez un moteur d'interpolation différent, tel que interpolation="template". Il a deux avantages.

  1. N'interfère pas avec les% signes.
  2. Prend en charge l'échappement. ($$ obtient interpolées $.)

L'exemple ressemblerait à ceci:

othervar = foo 
someconfigobjkey = $othervar %(runtimevar)s 
+0

C'est la méthode à utiliser! Notez que 'cfg = configobj.ConfigObj (..., interpolation = 'template')' semble n'avoir aucun effet sur la validation et un 'cfg.validate (...)' plus tard échouera toujours. Ce qui fonctionne est de changer l'interpolateur par défaut en définissant 'configobj.DEFAULT_INTERPOLATION = 'template''. Cela fonctionne à la fois dans Python 2 et Python 3. –

3

Essayez d'utiliser '%' + '(foo) s. Cela a fonctionné pour moi quand j'ai eu affaire à ConfigParser.

8

Les choses ont peut-être changé depuis que cette question a été postée, mais j'ai découvert que vous pouvez échapper en utilisant le caractère '%'. Cela a fonctionné pour moi en Python 3.

Dans mon fichier config.ini:

[LOGGING] 
format = %%(asctime)-15s %%(message)s 

Dans mon fichier script python:

import configparser 

# Load configuration 
config = configparser.ConfigParser() 
config.read("config.ini") 

log_config = config['LOGGING'] 

print(log_config['format']) # prints out '%(asctime)-15s %(message)s' 

aide quelqu'un espère que cela à l'avenir (:

+0

Cela a fonctionné pour moi avec SafeConfigParser! –