Kiat dan trik dari saluran Telegram saya @pythonetc, Desember 2018



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

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


All Articles