
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