تضمين التغريدة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