
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