@Pythonetc Desember 2018



Ini adalah pilihan ketujuh tips dan pemrograman Python dari umpan @pythonetc saya.

Pilihan sebelumnya:


Berbagai konteks


Kadang-kadang mungkin diperlukan untuk menjalankan blok kode di 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, ini dapat dilakukan dengan satu ekspresi:

 o = open with o('f') as f, o('g') as g, o('h') as h: pass 

Sebelumnya, Anda bisa menggunakan fungsi contextlib.nested :

 with nested(o('f'), o('g'), o('h')) as (f, g, h): pass 

Jika Anda bekerja dengan sejumlah manajer konteks yang tidak terbatas, lebih baik memilih alat yang lebih canggih. contextlib.ExitStack memungkinkan Anda untuk memasukkan sejumlah konteks kapan saja dan menjamin keluar dari mereka pada akhir eksekusi:

 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 menggunakan 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)] 

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 menghitung beberapa ratus karakter sebagai angka. Daftar lengkapnya di sini .

Ini penting untuk 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 Pyhon 3.5, objek datetime.time() dianggap salah jika mereka mewakili tengah malam UTC. Ini dapat menyebabkan bug yang tidak terlihat. Pada contoh berikut, if not mungkin gagal karena tidak create_time
adalah None , tetapi karena ini tengah malam.

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

Anda dapat mengatasi bug ini dengan secara eksplisit memeriksa None : if created_time is None .

Kerja asinkron dalam FS


Python tidak mendukung operasi file yang tidak sinkron. Untuk membuatnya non-blocking, Anda harus menggunakan utas.

Untuk eksekusi kode asinkron dalam aliran, Anda perlu menggunakan metode loop.run_in_executor .

Modul aiofiles pihak aiofiles dapat melakukan ini untuk Anda, menyediakan antarmuka yang nyaman dan sederhana:

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

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


All Articles