@ Pythonetc Dezember 2018



Dies ist die siebte Auswahl an Python-Tipps und -Programmierungen aus meinem @ pythonetc-Feed.

Vorherige Auswahl:


Mehrere Kontexte


Manchmal kann es erforderlich sein, einen Codeblock in mehreren Kontextmanagern auszuführen:

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

Seit Python 2.7 und 3.1 kann dies mit einem einzigen Ausdruck erfolgen:

 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 einer unbestimmten Anzahl von Kontextmanagern arbeiten, ist es besser, erweiterte Tools auszuwählen. contextlib.ExitStack können Sie jederzeit eine beliebige Anzahl von Kontexten eingeben und garantieren, dass diese am Ende der Ausführung beendet werden:

 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 sich derzeit im Speicher des Interpreters befinden, kann mit 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)] 

Ziffern


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

0 1 2 3 4 5 6 7 8 9 sind nicht die einzigen Zeichen, die als Ziffern betrachtet werden. Python folgt den Unicode-Regeln und zählt mehrere hundert Zeichen als Zahlen. Vollständige Liste hier .

Dies ist wichtig für 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 Pyhon 3.5 wurden datetime.time() -Objekte als falsch angesehen, wenn sie Mitternacht UTC darstellten. Dies kann zu nicht offensichtlichen Fehlern führen. Im folgenden Beispiel kann dies fehlschlagen, da nicht create_time
ist None , aber weil es Mitternacht ist.

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

Sie können diesen Fehler if created_time is None indem Sie explizit nach None if created_time is None : if created_time is None .

Asynchrone Arbeit in FS


Python unterstützt keine asynchronen Dateivorgänge. Um sie nicht zu blockieren, müssen Sie Threads verwenden.

Für die asynchrone Codeausführung in einem Stream müssen Sie die Methode loop.run_in_executor verwenden.

Ein aiofiles Modul eines aiofiles kann dies für Sie erledigen und bietet eine bequeme und einfache Oberfläche:

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

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


All Articles