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.
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
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).
Remarque : ce résultat est obsolète !
Le plan pour résoudre ce défi est le suivant :
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
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
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()
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
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).
Il s'agit d'ajouter un script appelé oeis, qui appelle la fonction oeis sur le module oeis. Maintenant, nous courons :
poetry new oeis
ce qui nous permettra d'appeler le script. Essayons :
poetry add click
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()
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()
Maintenant, le client a une url de base qui ne change pas. Passons aux autres méthodes :
Nous devons également mettre à jour notre fichier principal, pour appeler cette méthode :
# oeis/pyproject.toml [tool.poetry.scripts] oeis = "oeis:oeis"
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
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
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).
Si vous exécutez ce code, vous obtiendrez ceci maintenant :
poetry new oeis
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
Comme vous pouvez le constater, nous avons ajouté deux nouvelles méthodes :
# oeis/oeis/__init__.py import click @click.command() def oeis(): pass if __name__ == "__main__": oeis()
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()
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"
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!