Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
script:python:new:advanced [2013/09/15 11:08] alfred [Decorators] |
script:python:new:advanced [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 54: | Línea 54: | ||
| users_first_names = {user.first_name for user in users} | users_first_names = {user.first_name for user in users} | ||
| other = {x+x for x in 'patata'} # -> {'pp', 'aa', 'tt'} | other = {x+x for x in 'patata'} # -> {'pp', 'aa', 'tt'} | ||
| + | </code> | ||
| + | También puedes anidarlas: | ||
| + | <code python> | ||
| + | matrix = [[1, 2], [3, 4]] | ||
| + | [1, 2, 3, 4] | ||
| </code> | </code> | ||
| ==== Generators ==== | ==== Generators ==== | ||
| Línea 233: | Línea 238: | ||
| === *args y **kwargs === | === *args y **kwargs === | ||
| - | Para acceder a los parámetros de una llamada aprovecharemos ''*args'' (que contiene los parámetros por defecto de la función) y ''**kwargs'' (los especificados no por defecto en forma de diccionario). Puedes mirar el [[script:python:new:language#funciones|apartado de funciones]]. | + | Para acceder a los parámetros de una llamada aprovecharemos ''*args'' (que contiene los parámetros por defecto de la función) y ''<nowiki>**kwargs</nowiki>'' (los especificados no por defecto en forma de diccionario). Puedes mirar el [[script:python:new:language#funciones|apartado de funciones]]. |
| === Wraps en functools === | === Wraps en functools === | ||
| Línea 269: | Línea 274: | ||
| class Person(object): | class Person(object): | ||
| pass | pass | ||
| + | </code> | ||
| + | |||
| + | === O clases de decoradores === | ||
| + | <code python> | ||
| + | class IdentityDecorator(object): | ||
| + | def __init__(self, func): | ||
| + | self.func = func | ||
| + | def __call__(self): | ||
| + | self.func() | ||
| + | @IdentityDecorator | ||
| + | def a_function(): | ||
| + | print "I'm a normal function." | ||
| + | </code> | ||
| + | |||
| + | === Argumentos a decoradores === | ||
| + | <code python> | ||
| + | from functools import wraps | ||
| + | def argumentative_decorator(gift): | ||
| + | def func_wrapper(func): | ||
| + | @wraps(func) | ||
| + | def returned_wrapper(*args, **kwargs): | ||
| + | print "I don't like this " + gift + " you gave me!" | ||
| + | return func(gift, *args, **kwargs) | ||
| + | return returned_wrapper | ||
| + | return func_wrapper | ||
| + | @argumentative_decorator("sweater") | ||
| + | def grateful_function(gift): | ||
| + | print "I love the " + gift + "! Thank you!" | ||
| + | grateful_function() | ||
| + | # >> I don't like this sweater you gave me! | ||
| + | # >> I love the sweater! Thank you! | ||
| + | </code> | ||
| + | <code python> | ||
| + | from functools import wraps | ||
| + | GLOBAL_NAME = "Brian" | ||
| + | def print_name(function=None, name=GLOBAL_NAME): | ||
| + | def actual_decorator(function): | ||
| + | @wraps(function) | ||
| + | def returned_func(*args, **kwargs): | ||
| + | print "My name is " + name | ||
| + | return function(*args, **kwargs) | ||
| + | return returned_func | ||
| + | if not function: # User passed in a name argument | ||
| + | def waiting_for_func(function): | ||
| + | return actual_decorator(function) | ||
| + | return waiting_for_func | ||
| + | else: | ||
| + | return actual_decorator(function) | ||
| + | @print_name | ||
| + | def a_function(): | ||
| + | print "I like that name!" | ||
| + | @print_name(name='Matt') | ||
| + | def another_function(): | ||
| + | print "Hey, that's new!" | ||
| + | a_function() | ||
| + | # >> My name is Brian | ||
| + | # >> I like that name! | ||
| + | another_function() | ||
| + | # >> My name is Matt | ||
| + | # >> Hey, that's new! | ||
| </code> | </code> | ||
| Línea 288: | Línea 353: | ||
| === Notas === | === Notas === | ||
| + | * [[https://wiki.python.org/moin/PythonDecoratorLibrary|Decorators library]] | ||
| + | * [[http://code.activestate.com/search/recipes/#q=decorator|Búsqueda en la decorators library]] | ||
| + | |||
| + | ==== Unicode ==== | ||
| + | Para poder escribir por consola unicode: | ||
| + | <code python> | ||
| + | import sys | ||
| + | reload(sys) | ||
| + | sys.setdefaultencoding('utf-8') | ||
| + | </code> | ||
| ===== El lenguaje ===== | ===== El lenguaje ===== | ||
| Python trabaja internamente con objetos. Pocos son los datos que se guardan como valores y lo que comunmente denominamos "variables" serían mejor llamadas "nombres". Y es que una asignación es un enlace de un nombre a un objeto. | Python trabaja internamente con objetos. Pocos son los datos que se guardan como valores y lo que comunmente denominamos "variables" serían mejor llamadas "nombres". Y es que una asignación es un enlace de un nombre a un objeto. | ||