تضمين التغريدةPythonetc ديسمبر 2019



مجموعة جديدة من نصائح Python والبرمجة من خلال موجز pythonetc الخاص بي.

← المنشورات السابقة


من الواضح أن مهام asyncio المختلفة تستخدم أكواماً مختلفة. يمكنك عرضهم جميعًا في أي وقت من خلال تلقي asyncio.all_tasks() جميع المهام التي يتم تنفيذها حاليًا ، واستخدام task.get_stack() تلقي مكدسات لجميع المهام.

 import linecache import asyncio import random async def producer(queue): while True: await queue.put(random.random()) await asyncio.sleep(0.01) async def avg_printer(queue): total = 0 cnt = 0 while True: while queue.qsize(): x = await queue.get() total += x cnt += 1 queue.task_done() print(total / cnt) await asyncio.sleep(1) async def monitor(): while True: await asyncio.sleep(1.9) for task in asyncio.all_tasks(): if task is not asyncio.current_task(): f = task.get_stack()[-1] last_line = linecache.getline( f.f_code.co_filename, f.f_lineno, f.f_globals, ) print(task) print('\t', last_line.strip()) print() async def main(): loop = asyncio.get_event_loop() queue = asyncio.Queue() loop.create_task(producer(queue)) loop.create_task(producer(queue)) loop.create_task(producer(queue)) loop.create_task(avg_printer(queue)) loop.create_task(monitor()) loop = asyncio.get_event_loop() loop.create_task(main()) loop.run_forever() 

لكي لا تعاني مباشرة من كائن مكدس وعدم استخدام الوحدة النمطية linecache ، يمكنك استدعاء task.print_stack() .


باستخدام طريقة translate من str يمكنك تحويل أو حذف أحرف في سلسلة (كما تفعل الأداة المساعدة tr ):

 >>> 'Hello, world!'.translate({ ... ord(','): ';', ... ord('o'): '0', ... }) 'Hell0; w0rld!' 

الوسيطة الوحيدة translate هي القاموس الذي يتم فيه تعيين رموز الأحرف على أحرف (أو رموز). عادة ما يكون أكثر ملاءمة لإنشاء مثل هذا القاموس باستخدام الطريقة الثابتة str.maketrans :

 >>> 'Hello, world!'.translate(str.maketrans({ ... ',': ';', ... 'o': '0', ... })) 'Hell0; w0rld!' 

أو حتى:

 >>> 'Hello, world!'.translate(str.maketrans( ... ',o', ';0' ... )) 'Hell0; w0rld!' 

الوسيطة الثالثة هي إزالة الأحرف:

 >>> tr = str.maketrans(',o', ';0', '!') >>> tr {44: 59, 111: 48, 33: None} >>> 'Hello, world!'.translate(tr) 'Hell0; w0rld' 


لا mypy تعريفات النوع العودية بعد:

 from typing import Optional, Dict from pathlib import Path TreeDict = Dict[str, 'TreeDict'] def tree(path: Path) -> TreeDict: return { f.name: tree(f) if f.is_dir() else None for f in path.iterdir() } 

ستتلقى رسالة خطأ: Cannot resolve name "TreeDict" (possible cyclic definition) .

يمكنك متابعة الموقف هنا: https://github.com/python/mypy/issues/731


لتصبح وظيفة عادية متكررة ، يكفي أن تطلق على نفسها. لكن الأمور ليست بهذه البساطة مع المولدات: في أغلب الأحيان تحتاج إلى استخدام yield from المولدات العودية:

 from operator import itemgetter tree = { 'imgs': { '1.png': None, '2.png': None, 'photos': { 'me.jpg': None }, }, 'MANIFEST': None, } def flatten_tree(tree): for name, children in sorted( tree.items(), key=itemgetter(0) ): yield name if children: yield from flatten_tree(children) print(list(flatten_tree(tree))) 


يمكنك استخدام ليس فقط مع المتغيرات ، ولكن مع أي تعبير بشكل عام. يتم حسابه في كل تكرار:

 >>> log2 = {} >>> key = 1 >>> for log2[key] in range(100): ... key *= 2 ... >>> log2[16] 4 >>> log2[1024] 10 

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


All Articles