Outils pour utilisateurs

Outils du site


issue172:python

Well, I’ve made it. 10 full years worth of Python articles in the series. Actually, it’s been over 10 years in calendar time, but as far as articles are concerned, it’s 10 years worth. Thank you, dear readers, for hanging in with me for so long. Way back in the dawn of time, when rainbows were in black-and-white, and we had to watch television by candlelight because electricity hadn’t been invented yet, one of the first programming languages I learned well was Pascal. Along with everything else that Pascal had to offer, there was a data structure named Records. Records were special User Defined data types that would allow the programmer to set up a logical grouping of data using existing primitive types line string, integers, reals, and so on. When we would define a record, it would look something like this (top right). And so on. We could use an array of the records to maintain a very simple database type structure. Run the clock forward, and I eventually added Visual Basic (both DOS and Windows versions) to my toolkit of programming languages. Visual Basic also had a similar user defined type, but it was called a structure. You would define the structure like this: Public Structure TbookRec Public Title as String Public Author as String Public ISBN as String Public Price as Decimal End Structure Dim myBookRec as TbookRec TbookRec.Title = “I Robot” TbookRec.Author = “Isaac Asimov”

Eh bien, je l'ai fait. 10 années complètes d'articles sur Python dans la série. En fait, cela fait plus de 10 ans dans le calendrier, mais en ce qui concerne les articles, c'est l'équivalent de 10 ans. Merci, chers lecteurs, d'être restés si longtemps avec moi.

À l'aube des temps, lorsque les arcs-en-ciel étaient en noir et blanc et que nous devions regarder la télévision à la bougie parce que l'électricité n'avait pas encore été inventée, l'un des premiers langages de programmation que j'ai bien appris était le Pascal. En plus de tout ce que Pascal avait à offrir, il y avait une structure de données appelée Records. Les enregistrements étaient des types de données spéciaux définis par l'utilisateur qui permettaient au programmeur de mettre en place un regroupement logique de données en utilisant les types primitifs existants : chaîne de caractères, entiers, réels, et ainsi de suite. Lorsque nous définissions un enregistrement, il ressemblait à quelque chose comme ceci (en haut à droite).

Et ainsi de suite. Nous pouvions utiliser un tableau d'enregistrements pour maintenir une structure très simple de type base de données.

En avance rapide, j'ai fini par ajouter Visual Basic (versions DOS et Windows) à ma panoplie de langages de programmation. Visual Basic avait également un type similaire défini par l'utilisateur, mais on l'appelait une structure. Vous définissiez la structure comme ceci :

Public Structure TbookRec

  Public Title as String
  Public Author as String
  Public ISBN as String
  Public Price as Decimal

End Structure

Dim myBookRec as TbookRec TbookRec.Title = “I Robot” TbookRec.Author = “Isaac Asimov”

And on and on. When I came to Python (it was back before 3.0 came out), there wasn’t a convenient data structure like these. Having done a tonne of database work in my previous projects, I was somewhat at a loss. How could such a cool programming language like Python not have a structure like other languages. This month, we will be looking at dataclasses, something that was introduced back in Python 3.7: • Namedtuples were introduced back in Python 2.6 but namedtuples, like any tuples, are immutable. • Dataclasses are easy to use, easy to read, and are mutable. We’ll create a very simple (and unrealistic) small book store point of sale demo. Here’s how to start working with dataclasses. First, you have to import them into your project. They are a part of the dataclasses library. from dataclasses import dataclass Next, you need to add a decorator to start defining your class. The dataclass is like almost any other classes, but the init and repr functions, as well as a few other basic functions, are automatically created for you. We’ll take the structure from the discussion above… @dataclass class TbookRec: Title : str Author : str ISBN : str Price : float QtyOnHand : int Notice I added a field, QtyOnHand in our example. This makes it a bit more realistic but still minimal and a good way to demo the dataclass. At this point, we need to define an empty list to hold the record structures, and then create our in memory “database” by creating various “books” that will be in our imaginary store inventory.

Et ainsi de suite. Lorsque j'en suis arrivé à Python (c'était avant la sortie de la version 3.0), il n'y avait pas de structure de données pratique comme celles-ci. Ayant fait une tonne de travail sur les bases de données dans mes projets précédents, j'étais un peu perdu. Comment un langage de programmation aussi cool que Python pouvait-il ne pas avoir de structure comme les autres langages ?

Ce mois-ci, nous allons nous pencher sur les classes de données, un élément qui a été introduit en Python 3.7 : ••Les tuples nommés ont été introduits en Python 2.6 mais les tuples nommés, comme tous les tuples, sont immuables. ••Les classes de données sont faciles à utiliser, faciles à lire et sont mutables.

Nous allons créer une démo très simple (et irréaliste) de point de vente d'une petite librairie. Voici comment commencer à travailler avec les classes de données.

Tout d'abord, vous devez les importer dans votre projet. Elles font partie de la bibliothèque dataclasses.

from dataclasses import dataclass

Ensuite, vous devez ajouter un décorateur pour commencer à définir votre classe. La dataclass ressemble à presque toutes les autres classes, mais les fonctions init et repr, ainsi que quelques autres fonctions de base, sont automatiquement créées pour vous. Nous allons reprendre la structure de la présentation ci-dessus :

@dataclass classe TbookRec :

  Titre : str
  Auteur : str
  ISBN : str
  Prix : float
  QtyOnHand : int

Remarquez que j'ai ajouté un champ, QtyOnHand dans notre exemple. Cela rend l'exemple un peu plus réaliste, mais reste minimal et constitue une bonne façon de faire une démonstration de la classe de données. À ce stade, nous devons définir une liste vide pour contenir les structures d'enregistrement, puis créer notre « base de données » en mémoire en créant divers « livres » qui seront dans l'inventaire de notre magasin imaginaire.

myRecs = [] To make things a bit cleaner, we’ll create a function to do all the “database” entries at one time. We load the data into the dataclass and then append it to the myRecs list and “rinse and repeat”. I’ll show the creation of only three records, but in the demo file from the repository, I create five records. The main thing I want to show here is that inserting data into a dataclass is simple. So simple in fact, that, assuming you maintain the order of variables, you don’t have to include the field names. If you don’t keep the order of the variables, you must include the field names (top right). So you should see that it’s not only easy to put data into the dataclass record structure, but also to get the data that you want out just as easily. Now let’s create a function to search the recordset by author. Again, this is not a realistic search function, just a very simple one. The author name must be entered the way it is when it was put into the dataclass instances (bottom right). The output of the search function for Author looks like this… Title: The Hitchiker's Guide to the Galaxy Author: Douglas Adams ISBN: 978-0345391803 Price: 6.83 Qty: 1 Title: The Restaurant at the End of the Universe Author: Douglas Adams ISBN: 978-1529034530 Price: 7.99 Qty: 0 Now another simple function to search by book title. Remember, I’m not trying to cover any typos, capitalization errors, etc. Just trying to make it simple to show the ease of dealing with searching the data (top right). And it’s output is like this…

mesRecs = []

Pour rendre les choses un peu plus propres, nous allons créer une fonction pour effectuer toutes les entrées dans la « base de données » en une seule fois. Nous chargeons les données dans la classe de données, puis nous les ajoutons à la liste myRecs et nous « rinçons et répétons ». Je vais montrer la création de seulement trois enregistrements, mais dans le fichier de démonstration du dépôt, je crée cinq enregistrements. La principale chose que je veux montrer ici est que l'insertion de données dans une classe de données est simple. Tellement simple, en fait, que, si vous conservez l'ordre des variables, vous n'avez pas besoin d'inclure les noms des champs. Si vous ne conservez pas l'ordre des variables, vous devez inclure les noms des champs (en haut à droite).

Vous devriez donc voir qu'il est non seulement facile d'introduire des données dans la structure d'enregistrement de la classe de données, mais tout aussi facile d'en extraire les données que vous voulez.

Créons maintenant une fonction pour rechercher le jeu d'enregistrements par auteur. Encore une fois, il ne s'agit pas d'une fonction de recherche réaliste, mais d'une fonction très simple. Le nom de l'auteur doit être saisi tel qu'il est lorsqu'il a été placé dans les instances de la classe de données (en bas à droite).

Le résultat de la fonction de recherche par auteur ressemble à ceci :

Title: The Hitchiker's Guide to the Galaxy Author: Douglas Adams ISBN: 978-0345391803 Price: 6.83 Qty: 1

Title: The Restaurant at the End of the Universe Author: Douglas Adams ISBN: 978-1529034530 Price: 7.99 Qty: 0

Maintenant, une autre fonction simple pour une recherche par titre de livre. Rappelez-vous, je n'essaie pas de couvrir les fautes de frappe, les erreurs de capitalisation, etc. J'essaie juste de faire simple pour montrer la facilité de traiter la recherche des données (en haut à droite).

Et la sortie est comme ceci :

Enter Book Title → I Robot Title: I Robot Author: Isaac Asimov ISBN: 978-0553382563 Price: 6.79 Qty: 2 … Enter Book Title → Raise The Titanic Title: Raise The Titanic Author: Clive Cussler ISBN: 978-0425194522 Price: 9.99 Qty: 1 We’ll create one more very simple search function, this time by ISBN (bottom right). The output is as follows: Enter ISBN → 978-1529034530 Title: The Restaurant at the End of the Universe Author: Douglas Adams ISBN: 978-1529034530 Price: 7.99 Qty: 0 Now that we’ve covered the simple search functions, it only makes sense to add a function to “sell” one of our books. This also shows how easy it is to modify one of the dataclass items. We’ll “sell” one of our two copies of “I Robot”. While not grammatically correct, here is the output. (As my sainted mother would say, “Do as I say do, not as I do do.”) Enter Title →I Robot There are now 1 book(s) left in stock.

Enter Book Title → I Robot Title: I Robot Author: Isaac Asimov ISBN: 978-0553382563 Price: 6.79 Qty: 2 … Enter Book Title → Raise The Titanic Title: Raise The Titanic Author: Clive Cussler ISBN: 978-0425194522 Price: 9.99 Qty: 1

Nous allons créer une autre fonction de recherche très simple, cette fois-ci par ISBN (en bas à droite).

Le résultat est le suivant :

Enter ISBN → 978-1529034530 Title: The Restaurant at the End of the Universe Author: Douglas Adams ISBN: 978-1529034530 Price: 7.99 Qty: 0

Maintenant que nous avons abordé les fonctions de recherche simples, il est logique d'ajouter une fonction permettant de « vendre » l'un de nos livres. Cela montre également à quel point il est facile de modifier l'un des éléments de la classe de données. Nous allons « vendre » un de nos deux exemplaires de « I Robot ».

Bien que ce ne soit pas grammaticalement correct, voici le résultat. (Comme le dirait ma sainte mère, « Fais ce que je dis, ne fais pas ce que je fais »).

Enter Title →I Robot There are now 1 book(s) left in stock. (Il reste maintenant 1 livre en stock.)

And just to make sure, you can call for a refresh of the book data, the list of books shows that we did in fact decrement the quantity-on-hand for that book by calling the book function. Number of Unique Books: 5 Title: I Robot Author: Isaac Asimov Price: 6.79 Qty: 1 Title: The Gentle Giants of Ganymede Author: James P. Hogan Price: 6.11 Qty: 1 Title: Raise The Titanic Author: Clive Cussler Price: 9.99 Qty: 1 Title: The Hitchiker's Guide to the Galaxy Author: Douglas Adams Price: 6.83 Qty: 1 Title: The Restaurant at the End of the Universe Author: Douglas Adams Price: 7.99 Qty: 0 Now, last but not least, let’s create a “work” loop that offers a simple menu to handle the calls to the various functions (top right). So, I hope you find the use of dataclasses helpful in your future projects. If you want to learn more about Python dataclasses, you would do well to check out the really good discussion and guide at Real Python (https://realpython.com/python-data-classes/) written by Geir Arne Hjelle. You’ll be able to find the code for this month’s article at my github repository at https://github.com/gregwa1953/FCM-172 . Until next time, as always; stay safe, healthy, positive and creative!

Et pour être sûr, vous pouvez demander un rafraîchissement des données du livre, la liste des livres montre que nous avons en fait décrémenté la quantité disponible de ce livre en appelant la fonction livre.

Number of Unique Books: 5 Title: I Robot Author: Isaac Asimov Price: 6.79 Qty: 1 Title: The Gentle Giants of Ganymede Author: James P. Hogan Price: 6.11 Qty: 1 Title: Raise The Titanic Author: Clive Cussler Price: 9.99 Qty: 1 Title: The Hitchiker's Guide to the Galaxy Author: Douglas Adams Price: 6.83 Qty: 1 Title: The Restaurant at the End of the Universe Author: Douglas Adams Price: 7.99 Qty: 0

Enfin, créons une boucle « travail » qui offre un menu simple pour gérer les appels aux différentes fonctions (en haut à droite).

J'espère donc que l'utilisation des classes de données vous sera utile dans vos futurs projets.

Si vous voulez en savoir plus sur les classes de données Python, vous pouvez consulter la très bonne présentation et le guide de Geir Arne Hjelle sur Real Python (https://realpython.com/python-data-classes/).

Vous pourrez trouver le code de l'article de ce mois-ci dans mon dépôt github à l'adresse https://github.com/gregwa1953/FCM-172 .

Jusqu'à la prochaine fois, comme toujours ; restez en sécurité, en bonne santé, positif et créatif !

p 20 encart en haut à droite And then to put data into the record, we would do something like this. Et ensuite, pour mettre les données dans l'enregistrement, nous aurions fait ceci :

p 21 encart en haut à droite Now that we have that taken care of, we can create some simple functions to interact with the user. The first one will show a list of all the items in the “database” including the quantity on hand. Let’s call it “books” to keep things simple. Maintenant que nous nous en sommes occupés, nous pouvons créer quelques fonctions simples pour interagir avec l'utilisateur. La première montre la liste de tous les éléments de la « base de données », y compris la quatité en stock. Appelons-la « books » pour rester simple.

When the function books is called, the output will look like this… Quand la fonction books est appelée, la sortie ressemble à ceci :

issue172/python.txt · Dernière modification : 2021/08/31 17:28 de auntiee