Personal utils in Python


# -*- coding: utf-8 -*-

import os
import sys
import shutil
from time import perf_counter
from collections import defaultdict
from datetime import timedelta
from typing import Sequence, List, Dict, Hashable, Callable

from config.common import DEBUG  # 项目配置
from logger import base_logger  # 日志模块

utils_logger = base_logger.getChild('utils')

def progressbar(it: Sequence, name: str = 'In Progress', bar_length: int = 20, file=sys.stdout, verbose=False):
    def show(i):
        total = len(it)
        bar_progress = bar_length * i // total
        consumedsec = stepsec - startsec
        file.write(
            f'{name} {it[i-1] if verbose else ""}: '
            f'[{"#" * bar_progress}{"." * (bar_length - bar_progress)}] '
            f'{i}/{total} ({i / total:.2%}) '
            f'Time consumed: {timedelta(seconds=round(consumedsec))}; '
            f'Time left (approx.): {timedelta(seconds=round((total-i) / (i/consumedsec))) if i != 0 else "--"}\r'
        )
        file.flush()

    startsec = stepsec = perf_counter()
    show(0)
    for i, item in enumerate(it, start=1):
        yield item
        stepsec = perf_counter()
        show(i)
    file.write("\n")
    file.flush()


def overwrite_dir(dir_name: str):
    if os.path.isdir(dir_name):
        shutil.rmtree(dir_name)
    os.makedirs(dir_name)


def makedirs_if_not_exists(dir_name: str):
    if not os.path.isdir(dir_name):
        os.makedirs(dir_name)


def group_listofdict_bykey(entries: List[Dict], k: Hashable):
    result = defaultdict(list)
    for entry in entries:
        result[entry[k]].append(entry)
    return result


def debug_run(func: Callable, *args, **kwargs):
    if DEBUG:
        return func(*args, **kwargs)


def timer(func: Callable):
    def wrapper(*args, **kwargs):
        start = perf_counter()
        res = func(*args, **kwargs)
        utils_logger.debug('%.3f sec taken by function %s',
                    perf_counter() - start, func.__name__)
        return res
    return wrapper

posted @   LexLuc  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示