Maison > développement back-end > Tutoriel Python > Entretiens d'ingénieur logiciel - #EIS CLI

Entretiens d'ingénieur logiciel - #EIS CLI

Linda Hamilton
Libérer: 2024-11-29 04:55:10
original
774 Les gens l'ont consulté

Software Engineer Interviews - #EIS CLI

Introduction

Il s'agit du troisième article de la série d'entretiens avec des ingénieurs logiciels. J'ai relevé un défi que j'ai relevé il y a quelques années et j'ai effectivement obtenu le poste - d'autres entretiens techniques étaient impliqués, comme une sélection d'expériences antérieures.

Si vous avez manqué les posts précédents de cette série, vous pouvez les retrouver ici.

Le défi

Ce défi était également une tâche de codage à emporter, où je devais développer un programme CLI qui interrogerait l'OEIS (On-Line Encyclopedia of Integer Sequences) et renverrait le nombre total de résultats, ainsi que le nom du premier cinq séquences renvoyées par la requête.

Heureusement, le système de requête OEIS inclut un format de sortie JSON, vous pouvez donc obtenir les résultats en appelant l'URL et en transmettant la séquence sous forme de chaîne de requête.

Exemple d'entrée et de sortie :

oeis 1 1 2 3 5 7
Copier après la connexion
Copier après la connexion
Copier après la connexion
Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
Copier après la connexion
Copier après la connexion
Copier après la connexion

Remarque : ce résultat est obsolète !

Relever le défi

Le plan pour résoudre ce défi est le suivant :

  • Commencez avec un fichier Python qui sera le point d'entrée de la CLI
    • Il devrait recevoir une liste de nombres séparés par des espaces comme argument
  • Créer un fichier client qui se chargera de récupérer les données du système de requête OEIS
  • Un formateur qui se chargera de renvoyer la sortie formatée pour la console

Comme il s'agit d'un défi de codage, j'utiliserai Poetry pour m'aider à créer la structure du projet et pour faciliter son exécution. Vous pouvez vérifier comment installer et utiliser Poetry sur leur site Web.

Je vais commencer par créer le package avec :

poetry new oeis
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela créera un dossier appelé oeis, qui contiendra le fichier de configuration de Poetry, un dossier de test et un dossier également appelé oeis, qui sera la racine de notre projet.

J'ajouterai également un package facultatif, appelé Click, qui aide à créer des outils CLI. Ceci n'est pas obligatoire, et peut être remplacé par d'autres outils natifs de Python, bien que moins élégants.

Dans le dossier du projet, exécutez :

poetry add click
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela ajoutera click comme dépendance à notre projet.

Nous pouvons maintenant passer à notre fichier de point d'entrée. Si vous ouvrez le dossier oeis/oeis, vous verrez qu'il existe déjà un fichier __init__.py. Mettons-le à jour pour importer Click, et une fonction principale à appeler avec la commande :

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
Copier après la connexion
Copier après la connexion
Copier après la connexion

C'est le point de départ de notre CLI. Vous voyez la commande @click. Il s'agit d'un wrapper de click, qui nous aidera à définir oeis en tant que commande.

Maintenant, rappelez-vous que nous devons recevoir la séquence de nombres, séparés par un espace ? Nous devons ajouter ceci comme argument. Click a une option pour cela :

oeis 1 1 2 3 5 7
Copier après la connexion
Copier après la connexion
Copier après la connexion

Cela ajoutera un argument appelé séquence, et l'option nargs=-1 indique au clic qu'il sera séparé par des espaces. J'ai ajouté une impression afin que nous puissions tester que l'argument est correctement transmis.

Pour dire à Poetry que nous avons une commande, nous devons ouvrir pyproject.toml et ajouter les lignes suivantes :

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il s'agit d'ajouter un script appelé oeis, qui appelle la fonction oeis sur le module oeis. Maintenant, nous courons :

poetry new oeis
Copier après la connexion
Copier après la connexion
Copier après la connexion

ce qui nous permettra d'appeler le script. Essayons :

poetry add click
Copier après la connexion
Copier après la connexion
Copier après la connexion

Parfait, nous avons la commande et les arguments analysés comme prévu ! Passons au client. Sous le dossier oeis/oeis, créez un dossier appelé clients, un fichier appelé __init__.py et un fichier appelé oeis_client.py.

Si nous nous attendions à avoir d'autres clients dans ce projet, nous pourrions développer une classe de clients de base, mais comme nous n'aurons que cette seule classe, cela pourrait être considéré comme une ingénierie excessive. Dans la classe client OEIS, nous devrions avoir une URL de base, qui est l'URL sans les chemins, et que nous utiliserons pour l'interroger :

# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comme vous pouvez le voir, nous importons le package de requêtes. Nous devons l'ajouter à Poésie avant de pouvoir l'utiliser :

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()
Copier après la connexion
Copier après la connexion

Maintenant, le client a une url de base qui ne change pas. Passons aux autres méthodes :

  • build_url_params
    • Reçoit la séquence passée en argument depuis la CLI, et la transforme en une chaîne de nombres séparés par une virgule
    • Construit un dict avec les paramètres, le q étant la requête que nous allons exécuter et fmt étant le format de sortie attendu
    • Enfin, nous renvoyons la version codée en URL des paramètres, ce qui est un bon moyen de garantir que notre chaîne est compatible avec les URL
  • requête_results
    • Reçoit la séquence passée en argument de la CLI, construit les paramètres encodés en URL via la méthode build_url_params
    • Construit l'URL complète qui sera utilisée pour interroger les données
    • Procède à la requête vers l'URL créée et déclenche tout statut HTTP auquel nous ne nous attendions pas
    • Renvoie les données JSON

Nous devons également mettre à jour notre fichier principal, pour appeler cette méthode :

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
Copier après la connexion
Copier après la connexion

Ici, nous construisons maintenant une instance client, en dehors de la méthode, afin qu'elle ne crée pas d'instance à chaque fois que la commande est appelée, et ne l'appelle pas à l'intérieur de la commande.

L'exécution de cette opération entraîne une réponse très, très longue, puisque l'OEIS compte des milliers d'entrées. Comme nous avons seulement besoin de connaître la taille totale et les cinq premières entrées, nous pouvons procéder comme suit :

poetry install
Copier après la connexion

Gérer ceci est déjà bien mieux qu'avant. Nous imprimons maintenant la taille totale et les cinq premières entrées (si elles existent).

Mais nous n’avons pas non plus besoin de tout cela. Créons un formateur pour formater correctement notre sortie. Créez un dossier appelé formateurs, qui contiendra un fichier __init__.py et un fichier oeis_formatter.py.

oeis 1 1 2 3 5 7
Copier après la connexion
Copier après la connexion
Copier après la connexion

Ce fichier formate essentiellement les cinq premiers résultats selon ce que nous voulons pour la sortie. Utilisons-le dans notre fichier principal :

Found 1096 results. Showing first five:
1. The prime numbers.
2. a(n) is the number of partitions of n (the partition numbers).
3. Prime numbers at the beginning of the 20th century (today 1 is no longer regarded as a prime).
4. Palindromic primes: prime numbers whose decimal expansion is a palindrome.
5. a(n) = floor(3^n / 2^n).
Copier après la connexion
Copier après la connexion
Copier après la connexion

Si vous exécutez ce code, vous obtiendrez ceci maintenant :

poetry new oeis
Copier après la connexion
Copier après la connexion
Copier après la connexion

Il revient maintenant avec le format attendu, mais remarquez qu'il indique avoir trouvé 10 résultats. C'est faux, si vous effectuez une recherche sur le site Web de l'OEIS, vous verrez qu'il y a beaucoup plus de résultats. Malheureusement, il y a eu une mise à jour de l'API OEIS et le résultat ne renvoie plus le nombre de résultats. Cependant, ce décompte apparaît toujours sur la sortie au format texte. Nous pouvons l'utiliser pour savoir combien il y a de résultats.

Pour ce faire, nous pouvons modifier l'URL pour utiliser le fmt=text et une regex pour trouver la valeur souhaitée. Mettons à jour le code client pour récupérer les données texte et le formateur pour utiliser ces données afin que nous puissions les sortir.

poetry add click
Copier après la connexion
Copier après la connexion
Copier après la connexion

Comme vous pouvez le constater, nous avons ajouté deux nouvelles méthodes :

  • get_count
    • Construira les paramètres pour l'API de texte et les transmettra à la méthode qui utilisera l'expression régulière pour trouver le numéro que nous recherchons
  • get_response_count
    • Utilisera l'expression régulière construite dans l'initialisation de la classe pour effectuer une recherche et obtenir le premier groupe
# oeis/oeis/__init__.py

import click


@click.command()
def oeis():
    pass


if __name__ == "__main__":
    oeis()
Copier après la connexion
Copier après la connexion
Copier après la connexion

Dans ce fichier, nous avons uniquement ajouté un nouveau paramètre pour la méthode et l'avons utilisé à la place de la longueur du résultat de la requête.

# oeis/oeis/__init__.py

import click


@click.command()
@click.argument("sequence", nargs=-1)
def oeis(sequence: tuple[str]):
    print(sequence)


if __name__ == "__main__":
    oeis()
Copier après la connexion
Copier après la connexion

Ici, nous appelons simplement la nouvelle méthode sur le client et transmettons les informations au formateur. L'exécuter à nouveau donne le résultat attendu :

# oeis/pyproject.toml

[tool.poetry.scripts]
oeis = "oeis:oeis"
Copier après la connexion
Copier après la connexion

Le code est pratiquement prêt. Mais pour un vrai défi, n'oubliez pas d'utiliser Git lorsque cela est possible, d'effectuer de petits commits et, bien sûr, d'ajouter des tests unitaires, des bibliothèques de formatage de code, des vérificateurs de type et tout ce dont vous pensez avoir besoin.

Bonne chance !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal