Tipps und Tricks von meinem Telegramm-Kanal @pythonetc, Dezember 2018



Es ist eine neue Auswahl an Tipps und Tricks zu Python und Programmierung von meinem Telegramm-Kanal @pythonetc.

Mehrere Kontextmanager


Manchmal möchten Sie einen Codeblock mit mehreren Kontextmanagern ausführen:

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

Seit Python 2.7 und 3.1 können Sie dies mit einem einzigen Ausdruck tun:

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

Zuvor konnten Sie die Funktion contextlib.nested verwenden:

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

Wenn Sie mit der unbekannten Anzahl von Kontextmanagern arbeiten, passt das erweiterte Tool gut zu Ihnen. contextlib.ExitStack können Sie eine beliebige Anzahl von Kontexten zur beliebigen Zeit eingeben, diese jedoch am Ende garantiert beenden:

 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 ] 

Objekte im Interpreterspeicher


Auf alle Objekte, die derzeit im Interpreterspeicher vorhanden sind, kann über gc.get_objects() zugegriffen werden:

 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)] 

Ziffernsymbole


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

0 1 2 3 4 5 6 7 8 9 - sind nicht die einzigen Zeichen, die als Ziffern gelten. Python folgt den Unicode-Regeln und behandelt mehrere Hundert Symbole als Ziffern. Hier ist die vollständige Liste (http://www.fileformat.info/info/unicode/category/Nd/list.htm).

re.match betrifft Funktionen wie int , unicode.isdecimal und sogar re.match :

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

UTC Mitternacht


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

Vor Python 3.5 wurden datetime.time() -Objekte als falsch angesehen, wenn sie UTC Mitternacht darstellten. Das kann zu undurchsichtigen Fehlern führen. In den folgenden Beispielen if not möglicherweise nicht ausgeführt, weil create_time None , sondern weil es Mitternacht ist.

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

Sie können dies beheben, indem Sie explizit auf None testen: if created_time is None .

Asynchrone Dateivorgänge


In Python werden asynchrone Dateivorgänge nicht unterstützt. Um sie nicht zu blockieren, müssen Sie separate Threads verwenden.

Um Code im Thread asynchron auszuführen, sollten Sie die Methode loop.run_in_executor verwenden.

Das aiofiles Modul eines aiofiles erledigt all dies für Sie und bietet eine schöne und einfache Oberfläche:

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

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

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


All Articles