Python modèle pour le partage de configuration tout au long de l'application
J'ai une application composée d'une base application qui apporte plusieurs modules. L'application de la base de lit un fichier de paramètres dans une configuration de hachage, et je veux le partager entre tous mes modules.
Actuellement, je suis de passage "parent" de l'objet vers le bas pour les modules, et puis ces modules sont en train de faire des trucs comme soi-même.parent.config pour obtenir la configuration.
Toutefois, comme il existe plusieurs niveaux pour le module de la hiérarchie, je me retrouve à faire des choses comme moi.parent.parent.config qui commence à l'air mauvais.
Quels sont certains des meilleurs modèles pour le partage d'un objet de configuration à travers une application et des modules? Je pense avoir un 'config' module qui, fondamentalement, crée un mondial variable de config qui peut être définie par la base de l'app, puis importés et accessibles par les autres modules, mais je ne suis pas sûr si l'utilisation de variables globales comme ça, c'est une mauvaise pratique pour d'autres raisons.
Je suis raisonnablement Python donc être sympa =)
Vous devez vous connecter pour publier un commentaire.
Vous pourriez simplement:
et à l'échelle mondiale config du module
des extraits de mes commentaires:
Vous pouvez toujours ajouter des règles spéciales pour les situations en disant tout simplement
oddValue if isOddSituation() else config.normalValue
.Si vous voulez avoir la configuration de modules de hiérarchiquement subclassable (comme mon autre réponse décrit), alors vous pouvez représenter une config comme une classe, ou vous pouvez utiliser le
copy
module et de faire un peu de copier et de le modifier, ou vous pouvez utiliser un "config dictionnaire", par exemple:Il n'importe pas vraiment trop étendue que vous êtes dans.
oddValue if isOddSituation() else config.normalValue
. Si vous voulez avoir la configuration de modules de hiérarchiquement subclassable (comme mon autre réponse décrit), alors vous pouvez représenter une config comme une classe, ou vous pouvez utiliser lecopy
module et de faire un peu de copier et de le modifier, ou vous pouvez utiliser un "config dictionnaire", par exempleconfig = dict(baseConfig, overriddenValue=etc)
De répondre à la vieille question:
Juste utiliser l'injection de dépendance, tel que suggéré par @Reed Copsey ici. E. g.
Je pense que par "module", vous êtes en réalité référence à une classe/objet". Un objet est une instance d'une classe, par exemple:
Un module est un .py fichier que vous importez, comme suit:
Il semble peu probable que toutes les classes à instancier voulez avoir accès à une configuration globale. Toutefois, si vous avez vraiment besoin de tout ce qui dans votre application pour avoir accès à certains paramètres globaux, vous pouvez les mettre dans votre propre
config
module:et puis, à partir de n'importe quel module ou n'importe quel objet ou n'importe où en fait, tant que vous n'avez
import config
, vous pouvez simplement direprint(config.myParam1)
Sinon, si vous voulez une grande hiérarchie des objets à tous de partager l'accès à la propriété même, vous n'avez pas besoin de vous y référer par la configuration manuelle d'un
self.parent
. Aussi longtemps que vous utilisez à l'héritage, vous pouvez faire des trucs comme:Jetez un oeil à ce. Il pourrait vous aider:
https://gist.github.com/dgarana/c052a3287629dd7c0b0c9d7921081e9d