Je suis novice en python, et j'ai lu que l'utilisation de global
pour passer des variables à d'autres fonctions est considérée comme une mauvaise chose, ainsi qu'une mauvaise pratique. Je voudrais abandonner l'utilisation de variables globales, mais je ne suis pas sûr de savoir quoi faire à la place.Alternative au passage des variables globales autour des classes et des fonctions
À l'heure actuelle, j'ai une interface utilisateur que j'ai créée dans wxPython en tant que sa propre classe distincte, et j'ai une autre classe qui charge les paramètres d'un fichier .ini. Étant donné que les paramètres de l'interface utilisateur doivent correspondre à ceux du fichier .ini, comment puis-je contourner ces valeurs? Je pourrais utiliser quelque chose comme: Settings = Settings()
et ensuite définir les variables comme quelque chose comme self.settings1
, mais alors je devrais faire Settings
une variable globale pour le passer à ma classe d'interface utilisateur (ce ne serait pas si j'attribuer self.settings1
).
Alors, quelle est la manière correcte et pythonique de passer ces variables?
Editer: Voici le code avec lequel je travaille, et j'essaie de le faire fonctionner comme l'exemple d'Alex Martelli. Le code suivant est enregistré dans Settings.py
:
import ConfigParser
class _Settings():
@property
def enableautodownload(self): return self._enableautodownload
def __init__(self):
self.config = ConfigParser.ConfigParser()
self.config.readfp(open('settings.ini'))
self._enableautodownload=self.config.getboolean('DLSettings', 'enableautodownload')
settings = _Settings()
Chaque fois que je tente de se référer à Settings.settings.enableautodownload
d'un autre fichier que je reçois: AttributeError: 'module' object has no attribute 'settings'
. Qu'est-ce que je fais mal?
Éditer 2: Peu importe le problème, j'ai retapé le code et cela fonctionne maintenant, il doit donc s'agir d'une simple faute d'orthographe ou de syntaxe.
Il y a des cas où il est bon d'utiliser des globales, où la gêne occasionnée par la généralité du passage autour d'un objet est largement compensée. Vous devriez éviter cela quand vous commencez, jusqu'à ce que vous ayez une idée du moment approprié. –
semble que l'importation correcte devrait être 'à partir du paramètre d'importation Settings', alors vous pouvez l'utiliser, disons, comme' print settings.enableautodownload'. – flow