
Ini adalah pilihan baru tips dan trik tentang Python dan pemrograman dari saluran-Telegram saya @pythonetc.
Manajer konteks ganda
Terkadang Anda ingin menjalankan blok kode dengan beberapa manajer konteks:
with open('f') as f: with open('g') as g: with open('h') as h: pass
Karena Python 2.7 dan 3.1, Anda bisa melakukannya dengan satu
with
ekspresi:
o = open with o('f') as f, o('g') as g, o('h') as h: pass
Sebelum itu, Anda bisa menggunakan fungsi contextlib.nested:
with nested(o('f'), o('g'), o('h')) as (f, g, h): pass
Jika Anda bekerja dengan jumlah pengelola konteks yang tidak diketahui, alat yang lebih canggih cocok untuk Anda.
contextlib.ExitStack
memungkinkan Anda untuk memasukkan sejumlah konteks pada waktu yang sewenang-wenang tetapi menjamin untuk keluar pada akhirnya:
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 ]
Objek dalam memori juru bahasa
Semua objek yang saat ini ada dalam memori interpreter dapat diakses melalui
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)]
Simbol digit
In : int('୧৬༣') Out: 163
0 1 2 3 4 5 6 7 8 9
- bukan satu-satunya karakter yang dianggap digit. Python mengikuti aturan Unicode dan memperlakukan beberapa simbol sebagai digit, berikut adalah daftar lengkapnya (http://www.fileformat.info/info/unicode/category/Nd/list.htm).
Itu mempengaruhi fungsi seperti
int
,
unicode.isdecimal
dan bahkan
re.match
:
In : int('෯') Out: 9 In : '٢'.isdecimal() Out: True In : bool(re.match('\d', '౫')) Out: True
UTC tengah malam
>>> bool(datetime(2018, 1, 1).time()) False >>> bool(datetime(2018, 1, 1, 13, 12, 11).time()) True
Sebelum Python 3.5, objek
datetime.time()
dianggap palsu jika mereka mewakili UTC tengah malam. Itu dapat menyebabkan bug yang tidak jelas. Dalam contoh berikut ini
if not
dapat berjalan bukan karena
create_time
is
None
, tetapi karena ini adalah tengah malam.
def create(created_time=None) -> None: if not created_time: created_time = datetime.now().time()
Anda dapat memperbaikinya dengan menguji secara eksplisit untuk
None
:
if created_time is None
.
Operasi file tidak sinkron
Tidak ada dukungan di Python untuk operasi file asinkron. Untuk membuatnya non-blocking, Anda harus menggunakan utas terpisah.
Untuk menjalankan kode secara asinkron di utas, Anda harus menggunakan metode
loop.run_in_executor
.
Modul
aiofiles
pihak ketiga melakukan semua ini untuk Anda menyediakan antarmuka yang bagus dan sederhana:
async with aiofiles.open('filename', mode='r') as f: contents = await f.read()
Sumber:
habr.com/ru/company/mailru/blog/436322