[PYTHON] Metaclass (wip) pour générer un dictionnaire

Metaclass (wip) pour générer un dictionnaire

(TODO: je l'ajouterai si je peux penser à une utilisation)

J'ai créé une classe PreDict (OPreDict) qui renvoie un dictionnaire lorsqu'elle est appelée

Comment utiliser

Vous pouvez faire ce qui suit:

--Génération --Héritage --Fusionner

produire

Vous pouvez créer un dictionnaire comme s'il s'agissait d'une définition de classe.

class Person(OPreDict):
    name = Attribute(doc="Nom")
    age = Attribute(doc="âge")

print(Person())
# OrderedDict([('name', {'doc': 'Nom'}), ('age', {'doc': 'âge'})])

Il contient également la relation de classement des définitions de classe.

Héritage

Bien sûr, il peut être hérité car il s'agit d'une définition de classe.

class Info(PreDict):  #Puisqu'il n'est pas OPreDict, il ne maintient pas la relation de commande
    success = Attribute()
    failure = Attribute()


class Info2(Info):
    warnings = Attribute()

print(Info2())  # {'failure': {}, 'success': {}, 'warnings': {}}

Fusionner

Vous pouvez fusionner plusieurs classes ensemble.

class Student(OPreDict):
    grade = Attribute(doc="Année scolaire")


print((Student + Person)())
# OrderedDict([('grade', {'doc': 'Année scolaire'}), ('name', {'doc': 'Nom'}), ('age', {'doc': 'âge'})])

Possédé

Vous pouvez également générer une classe propriétaire de la classe.

class Parents(OPreDict):
    father = Attribute(Person, doc="père")
    mother = Attribute(Person, doc="mère")

import json
print(json.dumps(Parents(), ensure_ascii=False))
{"father": {"name": {"doc": "Nom"}, "age": {"doc": "âge"}, "doc": "père"},
 "mother": {"name": {"doc": "Nom"}, "age": {"doc": "âge"}, "doc": "mère"}}

Est-il possible de définir quelque chose comme une collection? ne peux pas. (TODO: Pensez à quelque chose plus tard)

Ingéniosité dans l'utilisation de l'attribut

Jusqu'à présent, Attribute a été utilisé comme s'il s'agissait simplement d'un champ pour générer un dictionnaire. Il semble que Attribute puisse être rendu un peu plus pratique en utilisant functools.partial.

Par exemple, définir un type de données.

from functools import partial
Number = partial(Attribute, type="number")
String = partial(Attribute, type="string")

Ensuite, vous pouvez obtenir le fichier json suivant.

class Person(OPreDict):
    name = String(doc="Nom")
    age = Number(doc="âge")


def pp(D):
    print(json.dumps(D, indent=2, ensure_ascii=False))

pp(Person())
# {
#   "name": {
#     "type": "string", 
#     "doc": "Nom"
#   }, 
#   "age": {
#     "type": "number", 
#     "doc": "âge"
#   }
# }

La mise en œuvre est ci-dessous https://gist.github.com/podhmo/5297214c9dc3ba57ec93

Recommended Posts

Metaclass (wip) pour générer un dictionnaire
Ajouter un dictionnaire à MeCab
Code qui génère un score au hasard
Script pour créer un fichier de dictionnaire Mac
Comment créer un dictionnaire avec une structure hiérarchique.
Comment générer un objet Python à partir de JSON
Générer un dictionnaire MeCab à partir des données de l'Encyclopédie Nico Nico
J'ai essayé de générer une chaîne de caractères aléatoire
Générer automatiquement un dictionnaire polaire utilisé pour l'analyse des émotions
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
Comment écrire un type liste / dictionnaire de Python3
Comment utiliser le dictionnaire {}
[Analyse morphologique] Comment ajouter un nouveau dictionnaire à Mecab
Générer un script bash pour ajouter les paramètres du moniteur Datadog
Accès aux champs du dictionnaire
Générez un mot de passe facile à retenir avec apg
Je veux générer automatiquement un nom de groupe de metal moderne
Comment générer une clé publique à partir d'une clé privée SSH
Comment générer une requête à l'aide de l'opérateur IN dans Django
Comment écrire une classe méta qui prend en charge à la fois python2 et python3
Un moyen relativement simple d'insérer un dictionnaire NEologd dans le dictionnaire Windows-System
Introduction à l'algorithme de recherche de dictionnaire
Créer un dictionnaire en Python
Une route vers Python intermédiaire
Une super introduction à Linux
Générons aléatoirement une séquence complète
Comment appeler une fonction
Télécharger un fichier sur Dropbox
Envoyer un signal au sous-processus
Comment pirater un terminal
Essayez de sélectionner une langue
Ajouter un dictionnaire utilisateur à MeCab
Développez un dictionnaire imbriqué Python pour faire quelque chose comme MultiIndex de Pandas
Comment vérifier la taille de la mémoire d'un dictionnaire en Python