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