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