~~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()
)