Upgrade to PRO for Only $50/Yearโ€”Limited-Time Offer! ๐Ÿ”ฅ

Learning by Trolling

Avatar for Anler Anler
November 21, 2015

Learning byย Trolling

PyConES 2015

Avatar for Anler

Anler

November 21, 2015
Tweet

More Decks by Anler

Other Decks in Programming

Transcript

  1. Learning by Trolling Aprende Python trolleando a tus compaรฑeros. ___________________________

    /| /| | | ||__|| | Please don't | / O O\__ feed | / \ the trolls | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________ @jespinog @anler
  2. Lecciรณn 1 Usa __init__.py para pasar desapercibido ___________________________ /| /|

    | | ||__|| | | / O O\__ Lesson number one: | / \ usa __init__.py | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________
  3. $ tree app app โ”œโ”€โ”€ __init__.py โ””โ”€โ”€ utils.py # cรณdigo

    del fichero __init__.py import warnings warnings.warn( "Error entre el teclado y la silla")
  4. $ python >>> import app.utils /home/anler/tmp/app/__init__.py:3: UserWarning: Error entre el

    teclado y la silla warnings.warn("Error entre el teclado y la silla") >>>
  5. Siempre que se importe cualquier mรณdulo dentro de un paquete,

    el cรณdigo dentro del fichero __init__.py del paquete es ejecutado. Por lo general a este fichero se aรฑade cรณdigo de inicializaciรณn troleo. Todos los ficheros __init__.py durante un import son ejecutados segรบn su orden de anidaciรณn.
  6. Lecciรณn 2 Usa monkey-patching siempre que puedas ___________________________ /| /|

    | | ||__|| | | / O O\__ Lesson number two: | / \ monkey patch pliss | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________
  7. Monkey Patch Se refiere a las modificaciones en tiempo de

    ejecuciรณn a una clase o mรณdulo motivado por la intenciรณn de parchear cรณdigo de terceros como soluciรณn a un bug o feature que no se comporta como es deseado.
  8. $ tree app โ”œโ”€โ”€ __init__.py โ””โ”€โ”€ utils.py # cรณdigo del

    fichero __init__.py from . import utils utils.current_year = lambda: โ€˜Problem?โ€™ # cรณdigo del fichero utils.py from datetime import date def current_year(): return date.today().strftime(โ€˜%Yโ€™)
  9. Trolleando Django lorem-ipsum โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ

    โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  10. from django.utils import lorem_ipsum lorem_ipsum.COMMON_P = ( 'Bacon ipsum dolor

    sit amet pork venison kielbasa, pork chop ham ' 'hock meatloaf frankfurter chicken shank tri-tip strip steak salami meatball. ' ... ) lorem_ipsum.WORDS = ( 'beef', 'chicken', 'pork', 'bacon', 'chuck', 'short loin', 'sirloin', 'shank', 'flank', 'sausage', 'pork belly', 'shoulder', 'cow', 'pig', โ€ฆ ) lorem_ipsum.COMMON_WORDS = ( 'consectetur', 'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt', 'ut', 'labore', 'et', 'dolore', 'magna', โ€ฆ )
  11. {% lorem %} Bacon ipsum dolor amet pig biltong pork

    fatback venison sausage corned beef ham hock kevin spare ribs porchetta pastrami. Sausage swine ribeye, bacon strip steak cow rump flank ball tip andouille short loin frankfurter doner. Short loin t- bone tail turducken flank sausage, ball tip picanha frankfurter kevin beef ribs. Jerky salami pork pig venison shankle filet mignon. Cupim corned beef shoulder boudin tri-tip. Bacon capicola pork belly jerky hamburger porchetta pork chop tail short loin. ...
  12. Troleando el tiempo โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ

    โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  13. $ tree app โ”œโ”€โ”€ __init__.py โ””โ”€โ”€ utils.py # cรณdigo del

    fichero __init__.py from random import random import time real_time = time.time time.time = lambda: real_time() + random() # cรณdigo del fichero utils.py import time def profile(): pre = time.time() print(โ€œExpensive computationโ€) time.sleep(1) post = time.time() taken = post - pre print(โ€œ{} secondsโ€.format(taken))
  14. $ python >>> from app.utils import profile >>> profile() expensive

    computation 0.4662015438079834 seconds >>> profile() expensive computation 0.9543671607971191 seconds
  15. Troleando la apertura de ficheros โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ

    โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  16. $ ls app โ”œโ”€โ”€ __init__.py โ”œโ”€โ”€ report.txt โ””โ”€โ”€ utils.py #

    cรณdigo del fichero __init__.py import builtins from io import StringIO as StrB builtins.open = lambda *a, **k: StrB(TROLL) TROLL = โ€œโ€โ€\ โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ ... โ€œโ€โ€ # cรณdigo del fichero utils.py def open_report(): return open(โ€œreport.txtโ€)
  17. $ python >>> from app.utils import open_report >>> with open_report()

    as report: โ€ฆ report.read() โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  18. En Python puedes hacer monkey-patch prรกcticamente cualquier cosa gracias a

    la estructura mutable de tabla hash de casi todos los objetos incluรญdos los mรณdulos y a que los mรณdulos solo se importan una vez y se guardan a modo cachรฉ en <sys.modules>. Antes de sobrescribir recuerda siempre guardar una referencia a la implementaciรณn original, puede que te haga falta utilizarla en algรบn otro sitio.
  19. Lecciรณn 3 Si monkey-patch se resiste, prueba con ctypes ___________________________

    /| /| | | ||__|| | | / O O\__ Lesson number three: | / \ ctypes es amigo | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________
  20. ctypes Nos provee con tipos de datos compatibles con C,

    por lo que nos permite modelar la estructura en C de un objeto y utilizar dicho modelo en nuestro cรณdigo para leer y modificar sus valores.
  21. Trolleando los enteros โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ

    โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  22. estructura de un entero en C +----------------+ | ob_refcnt |

    +----------------+ | ob_type | +----------------+ | ob_size | +----------------+ | ob_digit[] | +----------------+ En Python, id(entero) devuelve la direcciรณn de memoria al objeto que representa al entero este campo de la estructura contiene una referencia a la clase del objeto
  23. $ tree app โ”œโ”€โ”€ __init__.py โ””โ”€โ”€ utils.py # cรณdigo del

    fichero __init__.py from ctypes import * class EvilInt(int): __repr__ = lambda self: "42" __str__ = __repr__ lsize = sizeof(c_long) for n in range(258): addr = id(n) + lsize type_addr = c_long.from_address(addr) type_addr.value = id(EvilInt) # cรณdigo del fichero utils.py def body_mass_index(height, weight): return weight / height**2
  24. ctypes nos permite acceder a estructuras y funciones de C

    definidas en DLLs y shared-libraries directamente sin necesidad de escribir lo que se llama un โ€œextension moduleโ€.
  25. Lecciรณn 4 Si ctypes es muy complicado, prueba con masterkey

    ___________________________ /| /| | | ||__|| | | / O O\__ Lesson number four: | / \ masterkey es muy amigo | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________
  26. Trolleando los booleanos โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ

    โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  27. $ ls app โ”œโ”€โ”€ __init__.py โ””โ”€โ”€ utils.py # cรณdigo del

    fichero __init__.py from masterkey import open_class, close_class open_class(bool) bool.__repr__ = lambda x: โ€œFalseโ€ if x else โ€œTrueโ€ bool.__str__ = bool.__repr__ close_class(bool) # cรณdigo del fichero utils.py def as_boolean(x): return bool(x)
  28. El mรณdulo masterkey nos permite modificar la condiciรณn de inmutabilidad

    que tienen algunos tipos built-in para que podamos extenderlos con cualquier funcionalidad trolleo que se nos ocurra. Me pregunto si RubyOnRails empezรณ asรญ, como un trolleo...
  29. Lecciรณn 5 Si te aburres, modifica el intรฉrprete ___________________________ /|

    /| | | ||__|| | | / O O\__ Lesson number five: | / \ change all the things! | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________
  30. Python-EE Tracebacks โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ

    โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  31. Exception: EE ValueErrorException at <module>(ee-traceback.py:25) at func8(ee-traceback.py:23) at func7(ee-traceback.py:20) at

    func6(ee-traceback.py:17) at func5(ee-traceback.py:14) at func4(ee-traceback.py:11) at func3(ee-traceback.py:8) at func2(ee-traceback.py:5) at func1(ee-traceback.py:2)
  32. Python-EE Exceptions โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ

    โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  33. Traceback (most recent call last): File "invalid-import.py", line 1, in

    <module> import not_valid_module AbstractImportErrorBuilderException: No module named 'not_valid_module'
  34. assert no-determinista โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ

    โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  35. >>> assert True >>> assert True >>> assert True Traceback

    (most recent call last): File "<stdin>", line 1, in <module> AssertionError >>> assert True
  36. ND-Python (non-deterministic) โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–„โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–„โ–„ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–€โ–€โ–„ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–’โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–ˆโ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–€โ–’โ–„โ–„โ–„โ–’โ–‘โ–ˆโ–€โ–€โ–€โ–€โ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–ˆโ–„โ–„โ–ˆโ–‘โ–‘โ–‘โ–ˆ โ–ˆโ–’โ–ˆโ–’โ–„โ–‘โ–€โ–„โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–’โ–’โ–’โ–ˆ โ–ˆโ–’โ–ˆโ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆโ–€โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–„โ–€โ–€โ–€โ–„โ–’โ–ˆ โ–‘โ–ˆโ–€โ–„โ–‘โ–ˆโ–„โ–‘โ–ˆโ–€โ–„โ–„โ–‘โ–€โ–‘โ–€โ–€โ–‘โ–„โ–„โ–€โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆ

    โ–‘โ–‘โ–ˆโ–‘โ–‘โ–€โ–„โ–€โ–ˆโ–„โ–„โ–‘โ–ˆโ–€โ–€โ–€โ–„โ–„โ–„โ–„โ–€โ–€โ–ˆโ–€โ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–ˆโ–ˆโ–‘โ–‘โ–€โ–ˆโ–„โ–„โ–„โ–ˆโ–„โ–„โ–ˆโ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–ˆโ–‘โ–‘โ–‘โ–€โ–€โ–„โ–‘โ–ˆโ–‘โ–‘โ–‘โ–ˆโ–‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–ˆโ–„โ–€โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–€โ–„โ–„โ–‘โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–’โ–‘โ–ˆ โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–€โ–„โ–„โ–„โ–„โ–„โ–‘โ–‘โ–‘โ–‘โ–‘โ–ˆ
  37. >>> counter = 0 >>> while True is True: โ€ฆ

    counter += 1 โ€ฆ >>> print(counter) 1820 >>> counter = 0 >>> while True is True: โ€ฆ counter += 1 โ€ฆ >>> print(counter) 803
  38. >>> raise SystemExit ___________________________ /| /| | | ||__|| |

    The End, | / O O\__ Thank You! | / \ | / \ \ | / _ \ \ ---------------------- / |\____\ \ || / | | | |\____/ || / \|_|_|/ | __|| / / \ |____| || / | | /| | --| | | | // | ____ -- | ,* _ | |_|_|_| | \-/ ,*-- _--\ _ \ // | / _ \\ _ // | / / \_ /- | - | | ,* ___ c_c_c_C/ \C_c_c_c____________