[PYTHON] Pour rendre une propriété de type dict en lecture seule

Si la classe créée a une propriété de type «dict» et que vous ne voulez pas que l'utilisateur modifie l'élément de propriété sans autorisation, nous expliquerons comment utiliser MappingProxyType pour empêcher la modification de l'élément de propriété.

Par exemple, supposons le code suivant.

python


class Foo:
    
    def __init__(self):
        self._bar = {'a': 1, 'b': 2}

    @property
    def bar(self):
        return self._bar

    def add_item(self, key, value):
    #Je souhaite que les utilisateurs ajoutent des éléments uniquement via cette méthode
        self._bar[key] = value

Dans ce code, la propriété de classe Foo bar n'a pas de setter défini, donc l'utilisateur ne peut pas changer bar en un autre objet. Tenter de définir une valeur différente pour bar entraînera une erreur, comme indiqué ci-dessous.

python


>>> foo = Foo()
>>> foo.bar
{'b': 2, 'a': 1}
>>> foo.bar = 1
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    foo.bar = 1
AttributeError: can't set attribute

Cependant, puisque foo.bar lui-même est un dict, vous pouvez ajouter des éléments.

python


>>> foo.bar['c'] = 3
>>> foo.bar
{'b': 2, 'a': 1, 'c': 3}

Afin d'éviter les modifications involontaires du créateur d'une telle classe, il existe un moyen d'utiliser le type MappingProxyType de la bibliothèque types dans Python Ver 3.3 ou version ultérieure. Si vous utilisez le constructeur MappingProxyType et renvoyez le dictionnaire renvoyé en tant qu'objet proxy de mappage, l'utilisateur ne pourra pas modifier l'objet renvoyé. Si vous modifiez l'échantillon plus tôt, il ressemblera à ceci.

python


from types import MappingProxyType

class Foo:
    
    def __init__(self):
        self._bar = {'a': 1, 'b': 2}

    @property
    def bar(self):
        return MappingProxyType(self._bar)

    def add_item(self, key, value):
        self._bar[key] = value

Si l'utilisateur essaie d'ajouter un élément à la barre comme suit, une erreur se produit.

python


>>> foo = Foo()
>>> foo.bar
mappingproxy({'a': 1, 'b': 2})
>>> foo.bar['c'] = 3 #Tenter d'ajouter un élément entraînera une erreur.
Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    foo.bar['c'] = 3
TypeError: 'mappingproxy' object does not support item assignment
>>> foo.add_item('c', 3) #L'utilisateur ajoute un élément à l'aide d'une méthode.
>>> foo.bar
mappingproxy({'a': 1, 'c': 3, 'b': 2})

«mappingproxy» peut être utilisé comme un dictionnaire «en lecture seule» car vous pouvez obtenir des éléments de la même manière que «dict».

Recommended Posts

Pour rendre une propriété de type dict en lecture seule
Comment faire une traduction japonais-anglais
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer une fonction récursive
python / Créer un dict à partir d'une liste.
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
[Python] Comment rendre une classe itérable
J'ai créé une API Web
Comment créer un indicateur personnalisé Backtrader
Comment créer un plan de site Pelican
Comment créer un système de dialogue dédié aux débutants
Un mémorandum pour faire WebDAV uniquement avec nginx
Souhaitez-vous créer un CV Twitter?
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Comment créer un plug-in QGIS (génération de package)
Je souhaite créer un type d'implémentation pouvant être branché
J'ai lu "Comment créer un laboratoire de piratage"
Essayez de créer un groupe de dièdre avec Python
J'ai créé un jeu ○ ✕ avec TensorFlow
Explication de base de Lark (faites un gars comme une coquille avec Python, Lark)
J'ai essayé de faire un "putain de gros convertisseur de littérature"
Essayez de créer un module Python en langage C
Faisons un outil de veille de commande avec python
Comment faire un jeu de tir avec toio (partie 1)
Comment écrire un type liste / dictionnaire de Python3
Créer une fonction pour décrire les polices japonaises avec OpenCV
Comment créer un package Python à l'aide de VS Code
[Python] Je veux faire d'une liste imbriquée un taple
Les débutants en apprentissage automatique essaient de créer un arbre de décision
Bases de PyTorch (2) -Comment créer un réseau de neurones-
Convertir le type d'entité Webpay en type Dict (récursivement en Python)
Faire un décorateur de fonction
Utilisez Property Decorator?
Faire une matrice de distance
dict in dict Transforme un dict en dict
Convertir dict en tableau
Je vais créer un mot de passe!
Créer un bouton Nyan
Créez un jeu à la Tetris!
Créer un décodeur Base64
Comment créer un BOT Cisco Webex Teams à l'aide de Flask
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment créer un jeu d'action multijoueur en ligne avec Slack
Je veux créer un éditeur de blog avec l'administrateur de django
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64 bits Partie 2-
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Je veux faire une macro de clic avec pyautogui (désir)
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64-bit edition -
Combinez des listes dans un DataFrame avec des pandas
Comment faire un simple jeu Flappy Bird avec Pygame
Je veux faire une macro de clic avec pyautogui (Outlook)
J'ai fait un chronomètre en utilisant tkinter avec python
[Introduction à Tensorflow] Comprendre correctement Tensorflow et essayer de créer un modèle
Je veux ajouter un joli complément à input () en python
J'ai créé un éditeur de texte simple en utilisant PyQt