Я чувствую, что есть простой способ делать то, что я хочу здесь, но я не нахожу его. У меня есть одна функция, которая обрабатывает файл и извлекает структуру данных pythoni c, скажем DataFrame
. У меня есть еще одна функция, которая находит кучу файлов разного размера и возвращает итератор обработанным объектам, которые затем пользователи l oop превышают.
from .io import extract_dataset
def load_data(*args, **kwargs):
files = find_files(*args, **kwargs)
return map(extract_dataset, files)
for dataset in load_data(foo='bar'):
do_some_analysis(dataset)
Теперь я хотел бы предоставить приятный индикатор выполнения. Наивно, что я мог бы сделать
def load_data(*args, **kwargs):
files = find_files(*args, **kwargs)
return map(extract_dataset, tqdm(files))
Это нормально, но это сложно, потому что файлы имеют разные размеры. Я хотел бы указать размер файла на индикаторе выполнения для каждого l oop. Я не могу изменить extract_dataset
, который ожидает строк, а не файловых объектов, поэтому я не думаю, что могу использовать tqdm.wrapattr
. Думаю, я мог бы сделать:
def load_data(*args, **kwargs):
files = find_files(*args, **kwargs)
totalsize = sum(getfilesize(f) for f in files)
with tqdm(total=totalsize) as pbar:
for f in files:
pbar.update(getfilesize(f))
yield extract_dataset(f)
Эстетически мне нравится map
лучше, чем for...yield
, но есть ли разница в остальном?
Если я сделаю это, когда pbar
объект go выйдет из области видимости и будет очищен? Например, что, если итератор никогда не исчерпывается, но пользователь делает что-то вроде
mydataset = next(load_data())
. Тогда pbar
остается на неопределенное время? Что, если мне придется использовать pbar
в функции закрытия?