-1
votes

Accès de dictionnaire centralisé Python

Je souhaite créer un fichier pour contenir une liste des dictionnaires statiques de la recherche. Ce fichier serait accessible par tous les autres fichiers du projet, j'essaye donc essentiellement d'éviter la redondance des données et de mettre en place un contrôle centralisé.

Pour le faire, j'ai créé des dictionnaires de recherche créés et ajouté des méthodes getter à accès. Mais quand j'essaie d'utiliser la dicte, mes méthodes d'obtention ne semblent pas avoir une ventiel dans les dict déclarées globalement.

Voici ce que mon code ressemble à: xxx

Comme cela va être un dict statique, j'ai l'intention d'inclure cette classe et d'appeler les méthodes pour accéder aux noms de la province longue et courte.

Par exemple, j'appelle cela à partir d'une autre classe en utilisant:

global_lookup.get_province_long ('on')

`nom 'province_dict' n'est pas défini

Je m'attends au 'Ontario' pour être retourné .

Qu'est-ce que je fais mal?


7 commentaires

Pouvez-vous s'il vous plaît réparer l'indentation?


Veuillez vous assurer que votre indentation est correcte; Actuellement, il est impossible de comprendre ce qui se passe ici. Vous avez une classe, mais qu'en est-il à l'intérieur? Toutes ces fonctions sont-elles réellement des méthodes? Si oui, pourquoi ne prenez-ils pas auto ? Mais si tout est une classe, pourquoi dites-vous que le dict est global? Ce n'est pas, c'est à l'intérieur de la classe.


Mes excuses. J'ai essayé de corriger l'indentation. Laissez-moi savoir si cela semble compréhensible. Je viens d'inclure la classe où je pense que le problème est.


province_dict est parti maintenant, cependant. Est-ce aussi à l'intérieur de la classe?


@Ry je l'ai ajouté. Fondamentalement, le povince_dict n'est pas accessible aux deux fonctions d'obtention de ses deux. Je viens de former des antécédents Java et j'ai une compréhension très limitée de Python.


@glibDud i avait l'intention de les exécuter de la classe.


Python n'est pas Java. Vous n'avez pas besoin d'une classe ici.


3 Réponses :


1
votes

Ce dictionnaire sera un attribut de chaque instance de la classe. Par convention, l'instance est appelée auto code> à l'intérieur d'une méthode. Il est transmis à chaque méthode automatiquement, comme premier argument. Cela vous donne un moyen de faire référence à l'instance: elle s'appelle auto code>. Ensuite, vous pouvez obtenir sur les choses qu'il possède.

Essayez ceci: p>

class GlobalLookup:  # More conventional class name in Python

    PROVINCE_DICT = {
        "AB" : "Alberta",
        "BC" : "British Columbia",
        "MB" : "Manitoba",
        "NB" : "New Brunswick",
        "NL" : "Newfoundland and Labrador",
        "NT" : "Northwest Territories",
        "NS" : "Nova Scotia",
        "NU" : "Nunavut",
        "ON" : "Ontario",
        "PE" : "Prince Edward Island",
        "QC" : "Quebec",
        "SK" : "Saskatchewan",
        "YT" : "Yukon"
    }

    def get_province_short(self, province_long):
        for prov_shrt, prov_long in self.PROVINCE_DICT.items():
            if province_long == prov_long:
                return prov_shrt
        else:
            raise DatahubError(f"get_province_short - Province data for {province_long} could not be located")    

    def get_province_long(self, province_short): 
        prov_long = self.PROVINCE_DICT.get(province_short)
        if prov_long is None:
            raise DatahubError(f"get_province_long - Province data for {province_short} could not be located")
        return prov_long


4 commentaires

Les points que vous avez faits sont un nom de classe super utile, une utilisation d'obtenir à la place de [], sinon pour la boucle pour la boucle. Appréciez le temps que vous avez pris pour expliquer. Cependant, on dirait quand j'ai utilisé le code que vous avez recommandé, je reçois le get_province_long () 1 erreur de positionnement requis: 'province_short' erreur. J'ai dû ajouter @ClassMethod Decorator pour le réparer.


@Sushantvasishta Avez-vous appelé la méthode avec un argument? Vous devez passer dans province_short , par exemple gl = globallookup (); gl.get_prvince_long ('yt') .


Oh oui. Je viens d'ajouter @ClassMethod à votre code et cela a fonctionné.


@Sushantvasishta d'accord, mais vous n'avez pas besoin de puisque vous ne faites jamais référence à la classe, seule l'instance.



1
votes

province_dict code> est un attribut de classe de global_lookup code>. Il n'est pas automatiquement ajouté à l'espace de noms des méthodes. Puisque vous avez l'intention d'appeler ces méthodes directement à partir de la classe et que vous avez besoin d'un accès aux attributs de classe, vous devez déclarer ces méthodes en tant que méthodes de classe. Par exemple:

@classmethod
def get_province_short(cls, province_long):
    for prov_shrt, prov_long in cls.PROVINCE_DICT.items():
        if province_long == prov_long:
            return prov_shrt
        else:
            raise DatahubError(F"get_province_short - Province data for {province_long} could not be located") 


4 commentaires

Très serviable @glibDudd. Je n'ai jamais réalisé ce que les décorateurs sont utilisés. Mon premier cas d'utilisation ici. Appréciez l'aide.


Vous pouvez accéder aux attributs de classe dans les cas de la classe. Cela n'a pas besoin d'être une méthode de classe.


@kwinkunks sûr, vous peut , mais l'astucieux a indiqué qu'il avait prévu d'appeler les méthodes de la classe directement sans instanciation.


@glibdud d'accord, j'ai totalement oublié ça, merci. Et aussi je ne comprends pas. Hm.



1
votes

province_dict code> est une variable d'instance, nous pouvons donc accéder directement à une variable d'instance via le nom de la classe, comme class_name.variable_name code> dans la méthode de la classe.

class global_lookup: 

    PROVINCE_DICT = {
      "AB" : "Alberta",
      "BC" : "British Columbia",
      "MB" : "Manitoba",
      "NB" : "New Brunswick",
      "NL" : "Newfoundland and Labrador",
      "NT" : "Northwest Territories",
      "NS" : "Nova Scotia",
      "NU" : "Nunavut",
      "ON" : "Ontario",
      "PE" : "Prince Edward Island",
      "QC" : "Quebec",
      "SK" : "Saskatchewan",
      "YT" : "Yukon"
    }

    def get_province_short(province_long):
        for prov_shrt, prov_long in global_lookup.PROVINCE_DICT.items(): #updated
            if province_long == prov_long:
                return prov_shrt
            else:
                raise DatahubError(F"get_province_short - Province data for {province_long} could not be located")    

    def get_province_long(province_short): 
        if province_short in global_lookup.PROVINCE_DICT.keys(): # update
            return global_lookup.PROVINCE_DICT[province_short] #updated
        else:
            raise DatahubError(F"get_province_long - Province data for {province_short} could not be located")


1 commentaires

En utilisant le nom de la classe avec le nom de la méthode résolu mon problème.