Examen final : Compléments d’informatique

2A UE3

Published

October 7, 2024

Instructions

  • Examen sur papier
  • Durée : 2h
  • Une feuille A4 manuscrite recto/verso autorisée
  • Sans calculatrice
ImportantÀ lire avant de commencer

Le sujet est composé de plusieurs pages, numérotées de 1 à la dernière page.

  • Les exercices peuvent être traités dans l’ordre de votre choix.
  • Dans chaque exercice, les questions ne sont pas forcément de difficulté croissante.
  • Sauf mention contraire, les différentes questions attendent des réponses courtes.
  • Respectez scrupuleusement les consignes. Cependant, si une question ne vous semble pas claire, notez sur votre copie la manière dont vous l’avez comprise et traitée.
  • Quand du code est demandé, veuillez respecter les règles de bases du langage (mots clefs et indentation). Des erreurs seront tolérées, car vous êtes sur papier. En cas d’oubli d’un nom de méthode Python, utilisez du pseudo-code.
  • Excepté si c’est demandé, il n’est pas nécessaire d’écrire la documentation du code (même si la doc c’est bien !)

Bonne chance !

1 Questions de cours (7 points)

  1. Citez les différents niveaux de logs ?
  2. Quelle est la différence entre un formater et un linter ?
  3. Quels sont les rôles des différentes couches de la couche métier.
  4. Qu’est-ce qu’une classe abstraite ?
  5. Qu’est-ce que le bridge pattern ?
  6. Quel est l’intérêt de faire des tests unitaires ?
  7. À quoi sert un mock ?
  8. Parmi les principes CAID, détaillez celui d’Authentification et les mécanismes associés.

2 Webservices (3 points)

  1. Qu’est-ce qu’une API ?
  2. Nommez les différents éléments de la requête suivante :

GET https://pokeapi.fr:5000/pokemon?limit=10

  1. Parmi la liste suivante, quel package Python sert à interroger un webservice : requests, psycopg2, fastAPI, Insomnia, Django, inquirerPy ?

3 Code (7 points)

  1. Écrivez le code d’une fonction Python est_bissextile(annee) qui :
  • prend en paramètre un entier
  • retourne un booléen

Une année est bissextile si :

  • Elle est divisible par 4
  • Mais pas divisible par 100, sauf si elle est aussi divisible par 400
  1. Modifier le code ci-dessous pour appliquer le principe d’héritage.
class Pokemon:
    def __init__(self, name, level, type_pk, attack, defense):
        self.name: str = name
        self.level: int = level
        self.type_pk: str = type_pk
        self.attack: int = attack
        self.defense: int = defense

    def level_up(self, bonus:int=0) -> None:
        self.level += 1 + bonus

    def get_attack_coef(self) -> float:
        """Compute the attack coefficient"""
        if self.type_pk == "Attacker":
            return 1 + (self.attack) / 200
        elif self.type_pk == "Defender":
            return 1 + (self.defense) / 200
  1. Écrivez, en utilisant pytest, les tests unitaires de la méthode level_up ci-dessus.
  2. Écrivez la documentation de la méthode level_up ci-dessus.
  1. En vous aidant du modèle de données ci-dessous, écrivez une requête SQL qui permet d’afficher le nom et la puissance de toutes les attaques de type « Special »

  1. Relevez les erreurs et les mauvaises pratiques du code ci-dessous ? Quelles conséquences cela pourrait-il avoir ?
from dao.db_connection import DBConnection
from business_object.joueuse import Joueuse

class JoueuseDao(metaclass=Singleton):
    def se_connecter(self, pseudo, mdp) -> Joueuse:
        with DBConnection().connection as connection:
            with connection.cursor() as cursor:
                requete = " SELECT *                           "
                requete += "  FROM joueuse                     "
                requete += " WHERE pseudo = '" + pseudo + "'   "
                requete += "   AND mdp = '" + mdp + "';        "
                cursor.execute(requete)
                res = cursor.fetchall()
        return res

4 Git et Versionnage (3 points)

Vous travaillez avec deux collègues Alice et Bob qui découvrent git. Actuellement le projet de data science sur lequel vous travaillez tous est hébergé sur GitHub.

  1. Alice vous appelle car elle a besoin d’aide. Elle a passé son après-midi à travailler et veut pousser son code vers le dépôt distant mais elle ne sait pas comment faire. Comment doit-elle procéder ?

  2. Bob vous appelle car il n’arrive pas à pousser son code. Il reçoit en permanence cette erreur :

>>> git push
! [rejected] master -> dev (fetch first)
error: failed to push some refs to 'git@github.com:inseefrlab/dataproject.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository
hint: pushing to the same ref. You may want to first integrate the
hint: remote changes (e.g., 'git pull ...') before pushing again.

Aidez Bob pour qu’il puisse partager son code.

  1. Maintenant Bob reçoit ce message. Expliquez à Bob ce qu’il doit faire pour débloquer la situation.
>>> git pull
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (11/11), done.
remote: Total 8 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (8/8), 921 bytes | 25.00 KiB/s, done.
From github.com:inseefrlab/dataproject.git
d0790b4..3b27915  main       -> origin/main
Auto-merging main.py
CONFLICT (content): Merge conflict in main.py
Automatic merge failed; fix conflicts and then commit the result.
  1. À quoi sert le fichier .gitignore ?
  2. Vous arrivez un matin et tous les ordinateurs de votre société ont été volés. Est-ce grave pour votre projet ? Dans le pire des cas, combien de temps de travail avez-vous perdu ?