Dicas e truques do meu canal Telegram @pythonetc, dezembro de 2018



É uma nova seleção de dicas e truques sobre Python e programação no meu canal Telegram @pythonetc.

Vários gerenciadores de contexto


Às vezes, você deseja executar um bloco de código com vários gerenciadores de contexto:

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

Desde o Python 2.7 e 3.1, você pode fazer isso com um único with expressão:

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

Antes disso, você poderia usar a função contextlib.nested:

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

Se você estiver trabalhando com um número desconhecido de gerenciador de contexto, a ferramenta mais avançada combina com você. contextlib.ExitStack permite inserir qualquer número de contextos no momento arbitrário, mas garante sair deles no 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 na memória do intérprete


Todos os objetos que existem atualmente na memória do intérprete podem ser acessados ​​via 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 - não são os únicos caracteres considerados dígitos. O Python segue as regras Unicode e trata várias centenas de símbolos como dígitos, aqui está a lista completa (http://www.fileformat.info/info/unicode/category/Nd/list.htm).

Isso afeta funções como int , unicode.isdecimal e até re.match :

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

Meia-noite UTC


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

Antes do Python 3.5, os objetos datetime.time() eram considerados falsos se representassem a meia-noite do UTC. Isso pode levar a erros obscuros. Nos exemplos a seguir, if not pode ser executado não porque create_time é None , mas porque é meia-noite.

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

Você pode corrigir isso testando explicitamente None : if created_time is None .

Operações de arquivo assíncronas


Não há suporte no Python para operações de arquivo assíncronas. Para torná-los sem bloqueio, você deve usar threads separados.

Para executar de forma assíncrona o código no encadeamento, você deve usar o método loop.run_in_executor .

O módulo aiofiles terceiros faz tudo isso para você, fornecendo uma interface simples e agradável:

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

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

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


All Articles