PROJET AUTOBLOG


Sam et Max

source: Sam et Max

⇐ retour index

Comment recruter un développeur Python

samedi 27 octobre 2012 à 16:28

Bonjour M. Gentil. Vous venez pour la position de stagiaire ingénieur senior en periode d’essai sur 3 ans ?

C’est bien, c’est bien.

Nous avons des perspectives de progression fascinantes dans notre SS3I au carré.

J’ai juste quelques tests à vous faire passer. Trois fois rien. Simple formalité administrative. Vous comprenez, on ne peut pas embaucher pas n’importe quel Bac + 5 et le payer SMIC, comme ça sur un coup de tête.

Ce n’est pas contre vous, non.

Pourriez-vous me dire ce qu’affiche ce snippet ? (mouahahahahaha, rire diabolique intérieur)

def test():
 
    try:
        return 1 + "1"
    except TypeError:
        return "exception"
    finally:
        return "finally"
 
print test()

Et celui-là, il affiche la stack trace ou pas ?

def test():
 
    try:
        print 1 + "1"
    except TypeError:
        raise ValueError('Test')
    finally:
        return "finally"
 
print test()

Bon ok, mais si on a un générateur alors ?

def test():
 
    try:
        yield 1 + "1"
    except TypeError:
        yield 'typerror'
        return
    finally:
        yield "finally"
        return
 
    yield "Out"
 
for value in test():
    print value

Quelle exception sera catchée, dans le bout de code suivant ? (tapoter son style de manière énervante sur la table)

def test():
 
    try:
        assert 1 + "1"
    except AssertionError:
        print "assertionerror"
    except Exception:
        print "exception"
    except TypeError:
        print "typerror"
 
test()

Je vois. Donc finally est exécuté dans tous les cas ?

def test():
 
    def foo():
        foo()
 
    try:
        foo()
    except RuntimeError:
        print 'runtimeerror'
    finally:
        print 'finally'
 
test()

Vous êtes sûr ? VRAIMENT dans tous les cas ? (regard appuyé bien stressant, travaillé durant un poste de manager chez Quick)

def test():
 
    try:
        PRINTEUH !
    except SyntaxError:
        print 'syntaxerror'
    finally:
        print 'finally'
 
test()

VRAIMENT, VRAIMENT, dans tous les cas ? Mais alors, VRAIMENT ? (prendre la voix d’Alain Chabat, parce qu’arrivé à ce stade là c’est juste plus rigolo)

def test():
 
    def foo(bar):
        print bar
        return foo, bar
 
    bar = 'bar'
 
    try:
        while True:
            foo, bar = foo(bar)
 
    except RuntimeError:
        print 'runtimeerror'
    finally:
        print 'finally'
 
test()

Ne vous inquiétez pas, nous ne vous JUgeons paaaaaaas. Détendez-vous. Allez. Une petite dernière. Je vous aide. sys.exit(1) retourne le code 1.

import sys
 
def test(l=[]):
 
    print l
    try:
        return 1 + "1"
    except TypeError:
        return l or l.append(sys.exit(1))
    finally:
        print "Je sais plus là, sérieux"
        if len(l) < 1:
            test()
 
test()
test()

Bon, je sens que vous êtes fatigué. On va arrêter là peut être. Vous êtes le genre à vous en tenir là, hein ? Non. Très bien, très bien. Voici un code sur lequel on planche en interne depuis une semaine pour comprendre combien de fois il affiche finally, mais on s’est dit que vous pourriez le résoudre gratuitement pour nous:

import sys
import time
 
import multiprocessing
from Queue import Empty
 
in_queue = multiprocessing.Queue()
out_queue = multiprocessing.Queue()
 
def worker():
 
    while True:
 
        try:
            res = in_queue.get(timeout=0.1)
            if res == 'stop':
                sys.exit(1)
            print res
        except (Empty, multiprocessing.TimeoutError):
            pass
        finally:
            print 'finally'
 
 
process = multiprocessing.Process(target=worker)
process.start()
 
 
in_queue.put('test')
in_queue.put('stop')
 
print 'afterstop'
 
time.sleep(1)
 
print 'done'

Merci, ce sera tout.

Bon WE, monsieur Gentil.

Nous gardons votre CV. On vous recontactera.