Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

¿Qué es un Troll?

Slide 3

Slide 3 text

Para los ringers...

Slide 4

Slide 4 text

Para los mayores...

Slide 5

Slide 5 text

Para mi y para mis compañeros... @jespinog

Slide 6

Slide 6 text

¿Y en qué consiste?

Slide 7

Slide 7 text

Esto cree la mayoría...

Slide 8

Slide 8 text

Cuando la realidad es más así

Slide 9

Slide 9 text

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____________

Slide 10

Slide 10 text

$ tree app app ├── __init__.py └── utils.py # código del fichero __init__.py import warnings warnings.warn( "Error entre el teclado y la silla")

Slide 11

Slide 11 text

$ 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") >>>

Slide 12

Slide 12 text

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.

Slide 13

Slide 13 text

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____________

Slide 14

Slide 14 text

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.

Slide 15

Slide 15 text

$ 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’)

Slide 16

Slide 16 text

$ python >>> from app.utils import current_year >>> current_year() ‘Problem?’

Slide 17

Slide 17 text

Trolleando Django lorem-ipsum ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 18

Slide 18 text

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', … )

Slide 19

Slide 19 text

{% 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. ...

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Troleando el tiempo ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 22

Slide 22 text

$ 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))

Slide 23

Slide 23 text

$ python >>> from app.utils import profile >>> profile() expensive computation 0.4662015438079834 seconds >>> profile() expensive computation 0.9543671607971191 seconds

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

Troleando la apertura de ficheros ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 26

Slide 26 text

$ 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”)

Slide 27

Slide 27 text

$ python >>> from app.utils import open_report >>> with open_report() as report: … report.read() ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

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 . Antes de sobrescribir recuerda siempre guardar una referencia a la implementación original, puede que te haga falta utilizarla en algún otro sitio.

Slide 30

Slide 30 text

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____________

Slide 31

Slide 31 text

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.

Slide 32

Slide 32 text

Trolleando los enteros ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

$ 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

Slide 35

Slide 35 text

$ python >>> from app.utils import body_mass_index >>> body_mass_index(1.77, 78) 42 >>> 1.77 42 >>> 78 42

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

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”.

Slide 38

Slide 38 text

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____________

Slide 39

Slide 39 text

masterkey Permite redefinir los tipos primitivos de Python.

Slide 40

Slide 40 text

Trolleando los booleanos ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 41

Slide 41 text

$ 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)

Slide 42

Slide 42 text

$ python >>> from app.utils import as_boolean >>> as_boolean(1) False >>> as_boolean(False) True >>> False True

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

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...

Slide 45

Slide 45 text

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____________

Slide 46

Slide 46 text

Python-EE Tracebacks ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 47

Slide 47 text

Exception: EE ValueErrorException at (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)

Slide 48

Slide 48 text

Python-EE Exceptions ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 49

Slide 49 text

Traceback (most recent call last): File "invalid-import.py", line 1, in import not_valid_module AbstractImportErrorBuilderException: No module named 'not_valid_module'

Slide 50

Slide 50 text

assert no-determinista ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 51

Slide 51 text

>>> assert True >>> assert True >>> assert True Traceback (most recent call last): File "", line 1, in AssertionError >>> assert True

Slide 52

Slide 52 text

ND-Python (non-deterministic) ░░░░▄▄▄▄▀▀▀▀▀▀▀▀▄▄▄▄▄▄ ░░░░█░░░░▒▒▒▒▒▒▒▒▒▒▒▒░░▀▀▄ ░░░█░░░▒▒▒▒▒▒░░░░░░░░▒▒▒░░█ ░░█░░░░░░▄██▀▄▄░░░░░▄▄▄░░░█ ░▀▒▄▄▄▒░█▀▀▀▀▄▄█░░░██▄▄█░░░█ █▒█▒▄░▀▄▄▄▀░░░░░░░░█░░░▒▒▒▒▒█ █▒█░█▀▄▄░░░░░█▀░░░░▀▄░░▄▀▀▀▄▒█ ░█▀▄░█▄░█▀▄▄░▀░▀▀░▄▄▀░░░░█░░█ ░░█░░▀▄▀█▄▄░█▀▀▀▄▄▄▄▀▀█▀██░█ ░░░█░░██░░▀█▄▄▄█▄▄█▄████░█ ░░░░█░░░▀▀▄░█░░░█░███████░█ ░░░░░▀▄░░░▀▀▄▄▄█▄█▄█▄█▄▀░░█ ░░░░░░░▀▄▄░▒▒▒▒░░░░░░░░░░█ ░░░░░░░░░░▀▀▄▄░▒▒▒▒▒▒▒▒▒▒░█ ░░░░░░░░░░░░░░▀▄▄▄▄▄░░░░░█

Slide 53

Slide 53 text

>>> counter = 0 >>> while True is True: … counter += 1 … >>> print(counter) 1820 >>> counter = 0 >>> while True is True: … counter += 1 … >>> print(counter) 803

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Referencias ➔ yeti/django-bacon-ipsum ➔ jespino/python-master-key ➔ jespino/cpython-very-bad-things ➔ Playing with CPython Objects - Jesús Espino, EuroPython 2015

Slide 56

Slide 56 text

Ayúdame a cambiar la cara de la salud masculina https://es.movember.com/team/1948045

Slide 57

Slide 57 text

No content