Consejos y trucos de mi canal de Telegram @pythonetc, diciembre de 2018



Es una nueva selección de consejos y trucos sobre Python y la programación de mi canal de Telegram @pythonetc.

Múltiples administradores de contexto


A veces, desea ejecutar un bloque de código con varios administradores de contexto:

with open('f') as f: with open('g') as g: with open('h') as h: pass 

Desde Python 2.7 y 3.1, puede hacerlo con un solo with expresión:

 o = open with o('f') as f, o('g') as g, o('h') as h: pass 

Antes de eso, podría usar la función contextlib.nested:

 with nested(o('f'), o('g'), o('h')) as (f, g, h): pass 

Si está trabajando con un número desconocido de administrador de contexto, la herramienta más avanzada le conviene. contextlib.ExitStack permite ingresar cualquier número de contextos en el momento arbitrario, pero le garantiza salir al final:

 with ExitStack() as stack: f = stack.enter_context(o('f')) g = stack.enter_context(o('g')) other = [ stack.enter_context(o(filename)) for filename in filenames ] 

Objetos en la memoria del intérprete


Se puede acceder a todos los objetos que existen actualmente en la memoria del intérprete a través de gc.get_objects() :

 In : class A: ...: def __init__(self, x): ...: self._x = x ...: ...: def __repr__(self): ...: class_name = type(self).__name__ ...: x = self._x ...: return f'{class_name}({x!r})' ...: In : A(1) Out: A(1) In : A(2) Out: A(2) In : A(3) Out: A(3) In : [x for x in gc.get_objects() if isinstance(x, A)] Out: [A(1), A(2), A(3)] 

Símbolos de dígitos


 In : int('୧৬༣') Out: 163 

0 1 2 3 4 5 6 7 8 9 - no son los únicos caracteres que se consideran dígitos. Python sigue las reglas de Unicode y trata varios cientos de símbolos como dígitos, aquí está la lista completa (http://www.fileformat.info/info/unicode/category/Nd/list.htm).

Eso afecta funciones como int , unicode.isdecimal e incluso re.match :

 In : int('෯') Out: 9 In : '٢'.isdecimal() Out: True In : bool(re.match('\d', '౫')) Out: True 

Medianoche UTC


 >>> bool(datetime(2018, 1, 1).time()) False >>> bool(datetime(2018, 1, 1, 13, 12, 11).time()) True 

Antes de Python 3.5, los objetos datetime.time() se consideraban falsos si representaban la medianoche UTC. Eso puede conducir a errores oscuros. En los siguientes ejemplos, if not puede ejecutarse no porque create_time es None , sino porque es medianoche.

 def create(created_time=None) -> None: if not created_time: created_time = datetime.now().time() 

Puede solucionarlo probando explícitamente None : if created_time is None .

Operaciones asíncronas de archivos


No hay soporte en Python para las operaciones asíncronas de archivos. Para que no se bloqueen, debe usar hilos separados.

Para ejecutar código asincrónicamente en el hilo, debe usar el método loop.run_in_executor .

El módulo aiofiles terceros hace todo esto por usted proporcionando una interfaz agradable y simple:

 async with aiofiles.open('filename', mode='r') as f: contents = await f.read() 

Fuente: habr.com/ru/company/mailru/blog/436322

Source: https://habr.com/ru/post/es436324/


All Articles