~~stoggle_buttons~~ ====== Links ====== * [[https://python-patterns.guide/|python patterns guide]] ====== Separación de conceptos con iteradores ====== Con colas se da mucho el caso en el que vamos quitando elemento de la cola hasta que se queda vacía, o hasta que eliminamos todos los elementos urgentes. Para evitar usar variables definidas en ''main'' como ''data'' y ''current_element'': def main(): import Queue transactions = Queue.SimpleQueue() . . data = [] processed_transactions = [] current_element = q.get_nowait() for transaction in transactions: apply(q, account) processed_transactions.append(transaction.id) def apply(q, account): . . while account.status == OK: data.append(current_element) current_element = q.get_nowait() . . Limpiamos el código creando un iterable def main(): import Queue transactions = Queue.SimpleQueue() . . data = [] for transaction in apply(transactions, account): data.append(transaction) processed_transactions.append(transaction.id) def apply(q, account): # Procesamos el primero como caso especial current_element = q.get_nowait() yield process(current_element) while account.status == OK: yield process(current_element) current_element = q.get_nowait() Así separamos logramos que la función apply no sepa nada de la lista ''data'' y que la función ''main'' no sepa nada de ''current_element'' ====== single quotes vs double quotes ====== [[https://stackoverflow.com/questions/56011/single-quotes-vs-double-quotes-in-python]] **doble quotes** * Natural language messages * Filenames * docstrings or large strings -> triple double quotes ''%%"""%%'' **single quotes** * Symbol-like strings * dict keys (unless they are natural language) * f-strings * regexs **Break the rules if the strings contain quotes** "A literal 'quote' inside a string" 'A literal "quote" inside a string' * [[https://pep8.org/]] * [[https://www.python.org/dev/peps/pep-0008/]] ====== import recomendados ====== . |-- common | |-- __init__.py | |-- models.py | |-- views.py | |-- controllers.py | `-- plugins | |-- __init__.py | |-- display.py | `-- parallel.py `-- interactive |-- __init__.py |-- main.py |-- actions | `-- click.py | `-- select.py `-- events |-- __init__.py |-- onclick.py `-- onselect.py # common/models.py if __name__ == "__main__": main() * Cuando hacemos un import, se ejecuta todo el script. Para evitar que se ejecute el script cuando importamos, sólo lo ejecutamos si ''%%__name__ == "__main__"%%'' * Si hacemos ''import common'' se ejecuta ''%%./common/__init__.py%%'', pero si no existe, falla ===== Importar saltándose los __init__ ===== * ''from common.plugins import display'' puede que ejecute los ''%%__init__.py%%'' de ''common'' y ''plugins''. Para evitarlo; import sys # Lo pongo en una línea porque no es separable conceptualmente sys.path.append('common/plugins'); import display ===== reloads ===== # Cuando importamos código de otras librerías, podemos hacer sin problema from module import function # Pero cuando estamos trabajando con módulos propios, conviene importarlos siempre # con el nombre del módulo import module foo = module.function() # Así cuando cambiamos module, podemos recargarlo sin tener que reiniciar IPython: from importlib import reload reload(module) ====== fluent interfaces multiline ====== html = ( df.style .format(percent) .applymap(color_negative_red, subset=['col1', 'col2']) .set_properties(**{'font-size': '9pt', 'font-family': 'Calibri'}) .bar(subset=['col4', 'col5'], color='lightblue') .render() )