[PYTHON] J'ai fait un truc fou appelé tuple typé

Qu'est-ce que typedtuple?

Pour le dire clairement, il peut être décrit de manière déclarative au format voluptueux / tuple nommé qui valide au moment de la génération. Il est destiné à une utilisation dite de classe de cas.

Un peu plus de détails

Par exemple, lors de la gestion de divers éléments de ligne dans la base de données, le dict brut convient, mais je veux le taper de sorte que l'intention puisse être transmise par un accès en indice ou le code terne lui-même, mais à cette fin, il correspond trop pour définir la classe. Tu ne penses pas? j'ai

Vous pouvez également utiliser toolz ou fn.py pour écrire en python comme FP, Pensez-vous que vous vouliez un objet immuable? j'ai

Ces deux problèmes peuvent être résolus simplement en utilisant namedtuple, mais en plus de cela, il est nécessaire de vérifier quel est le type d'attribut maintenant, ce qui devient gênant lors de l'écriture d'une grande quantité de code d'application. Il y avait, par exemple, que je voulais convertir automatiquement une chaîne de caractères ISO-8601 en datetime.

En réponse à cette situation, typedtuple vise à fournir une implémentation dans laquelle la vérification et la conversion de type sont automatiquement effectuées lorsqu'un namedtuple est créé simplement en décrivant de manière déclarative la structure de type.

Comment utiliser

J'ai beaucoup écrit dans ici, mais utilisez typedtuple.TypedTuple de la même manière que namedtuple ou utilisez le décorateur typedtuple.schema (propriété et méthode pour TypedTuple) Si vous voulez ajouter), définissez le type en spécifiant voluptuous.Schema. Lorsque l'instance est créée, le schéma spécifié est utilisé pour vérifier la valeur et effectuer une conversion automatique. Pour la vérification / conversion par volupté, reportez-vous à ce document ou code.

from typedtuple import TypedTuple
from voluptuous import Coerce

Vector = TypedTuple('Vector', {'x': Coerce(float), 'y': Coerce(float)})

v0 = Vector(x=10, y='20.0')

# voluptuous.Coerce convertira automatiquement tout ce qui peut être converti en flottant
print v0  # Vector(x=10.0, y=20.0)

v1 = Vector(x='x', y=20.0)  # raises exception

# TypedTuple=Puisqu'il est nommé tuple et immuable, la mise à jour des attributs est nommé tuple._Utilisera replace pour générer une autre valeur
v2 = v0._replace(y=30.0)  

point important

Puisque la structure est spécifiée par «dict», qui ne garantit pas l'ordre des éléments, il n'est pas possible de spécifier l'ordre des attributs tel qu'il est même s'il s'agit en fait d'un «tuple». Cela ne devrait pas être un problème pour une utilisation basique, mais si vous voulez spécifier l'ordre strictement, vous pouvez utiliser collections.OrderedDict.

from collections import OrderedDict
from typedtuple import TypedTuple
from voluptuous import Coerce

Vector = TypedTuple('Vector', OrderedDict((('x', Coerce(float)), ('y', Coerce(float))))
print Vector._fields  #vous devez('x', 'y', 'z')devenir(OrderedDictを使わない場合、順序は不定devenir)

Une autre mise en garde est qu'il est probablement assez lourd à générer. Peut-être que cela ne peut pas être aidé, alors prenez une référence.

Autres exemples

from voluptuous import All, Range, Length, Optional
from typedtuple import schema

@schema({
    'id': All(int, Range(min=0)),                #id est toujours un entier positif
    'password': All(str, Length(min=8)),  #le mot de passe est une chaîne de 8 caractères ou plus
    'first_name': str,
    'last_name': str,
    Optional('nickname'): str,            #Peut être omis lors de la génération s'il est défini sur Facultatif
})
class User(object):
    # typedtuple(Ou plutôt nommé tuple)Impossible d'ajouter des attributs, mais des propriétés et des méthodes peuvent être ajoutées
    @property
    def full_name(self):
        return '{} {}'.format(self.first_name, self.nick_name)

# raises exception
alice = User(id=-1, password='xxxxxxxx', first_name='Alice', last_name='Kakehashi', nick_name='kkhs')

# raises exception
bob = User(id=1, password='short', first_name='Bob', last_name='Kakehashi', nick_name='kkhs')

# nick_name is optional
carol = User(id=2, password='xxxxxxxx', first_name='Carol', last_name='Kakehashi')

la fin

J'écrirai bientôt sur le voluptueux.

Recommended Posts

J'ai fait un truc fou appelé tuple typé
J'ai fait un texte Python
J'ai fait un robot discord
J'ai créé un site d'apprentissage C ++
J'ai fait un Line-bot avec Python!
J'ai créé un script de traduction basé sur CUI (2)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un script de traduction basé sur CUI
J'ai créé un démon avec Python
J'ai créé un jeu appelé Battle Ship en utilisant pygame et tkinter
J'ai mis dans un Bash appelé Powerline-shell qui me rend fou
J'ai créé un docset de tableau de bord pour Holoviews
J'ai fait un programme de gestion de la paie en Python!
J'ai touché "Orator" alors j'ai fait une note
J'ai fait un compteur de caractères avec Python
Débutant: j'ai créé un lanceur à l'aide d'un dictionnaire
J'ai fait un interlocuteur comme Siri
J'ai fait un script pour afficher des pictogrammes
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai créé un outil d'estampage automatique du navigateur.
Après avoir étudié Python3, j'ai créé un Slackbot
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une bibliothèque pour l'assurance actuarielle
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un fichier de dictionnaire python pour Neocomplete
J'ai fait une prévision météo de type bot avec Python.
J'ai fait un algorithme de rechange2 moins cher pour uWSGI
J'ai créé un outil utile pour Digital Ocean
J'ai créé une application graphique avec Python + PyQt5
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
J'ai créé un outil de collecte de configuration de routeur Config Collecor
J'ai fait un simple portefeuille de Bitcoin avec pycoin
J'ai créé un téléchargeur pour l'expression distribuée par mot
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé un outil pour compiler nativement Hy
J'ai créé un outil pour obtenir de nouveaux articles
J'ai fait un graphique de nombres aléatoires avec Numpy
Nous avons créé un produit de prévention du télétravail.
J'ai fait un simple lecteur RSS ~ Edition C ~
J'ai créé un programme cryptographique César en Python.
J'ai fait un jeu de cueillette avec Python
Made Mattermost Bot avec Python (+ Flask)
Création du wrapper d'API Qiita Python "qiipy"
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
En fait, j'ai tapé statiquement un extrait de code approprié avec mypy
Création de l'outil de gestion des utilisateurs Let's Chat
J'ai effectué un processus de connexion / déconnexion en utilisant Python's Bottle.
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
J'ai fait un jeu d'éclairage de sapin de Noël avec Python