@JRBRO

Как правильно совместить циклы с функциями?

Вот, настал тот момент когда пора лечить все костыли и совместить все в один питон файл. Столкнулся с тем, что без новых костылей, старые пока решить не выходит и хочу спросить небольшой совет. Как логичнее завернуть следующую логику:

Скачать пачку скриншотов
Обработать пачку скриншотов
Вытащить всю информацию

Во всех скриптах, есть единый список используемый для цикла

Если я заворачиваю это все по отдельным функциям
def get_snap():
aList = "http://сайт-со-снепшотами.com"
bList = ['список',  'имен',  'для',  'снепшотов'] 
    for a, b in zip(aList, bList):
        try:
    #КАЧАЕМ СНЕПШОТЫ
        except BaseException:
            pass

def process_snap():
bList = ['список', ' имен',  'для',  'снепшотов'] 
    for b in bList):
        try:
    #ОБРАБАТЫВАЕМ
        except BaseException:
            pass

def snap_results():
bList = ['список', 'имен',  'для',  'снепшотов'] 
    for b in bList):
        try:
    #ДОСТАЕМ ИНФУ
        except BaseException:
            pass


Как правильно было бы это все упростить, с учетом того, что все функции вызываются по очереди и все они содержат одинаковый цикл?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну простейший вариант:
# типы данных. Они могут быть классами, или описаниями вида typing.Tuple[int, str]
# так как ты не описал типы данных, я пишу тут заглушки typing.Any (т.е. что угодно)
# эти типы лучше описать в отдельном файле, который будет импортироваться остальными
Snaphot = typing.Any
PreparedSnapshot = typing.Any
SnapshotResult = typing.Any

# функции обработки. они могу быть раскиданы по отдельным файлам, 
# но они должны импортить нужные модули, в т.ч. описание типов данных
# ни одна функция не должна выбрасывать исключения
def get_snapshot(site: str, name: str) -> typing.Optional[Snapshot]:
    "Качает один снапшот с сайта и возвращает его, или None если была ошибка."
    ...

def prepare_snapshot(snapshot: Snapshot) -> typing.Optional[PreparedSnapshot]:
    "Подготавливает один снапшот к обработке. Возвращает None при ошибке."
    ...

def process_prepared_snapshot(snapshot: PreparedSnapshot) -> typing.Optional[SnapshotResult]:
    "Извлекает нужные сведения из одного снапшота и возвращает их как структуру данных, или None при неудаче."
    ...

# эта функция будет в главном запускаемом файле
# главный файл должен импортировать остальные
targets = zip(...)  # ну или как ты там делаешь список
# и вот тут уже главный цикл
# вариант А - классический цикл
results: typing.List[SnapshotResult] = []
for site, name in targets:
    snap = get_snapshot(site, name)
    if snap is not None:
        prepared = prepare_snapshot(snap)
        if prepared is not None:
            result = process_prepared_snapshot(prepared)
            if result is not None:
                results.append(result)
# вариант Б - более функциональный подход
# фильтрует коллекцию, отбрасывает None
def skipNone(items):
    return filter(lambda item: item is not None, items)

results: typing.List[SnapshotResult] = list(skipNone(
    map(process_prepared_snapshot, skipNone(
        map(prepare_snapshot, skipNone(
            get_snapshot(site, name) for site, name in targets
        ))
    ))
))
# в любом случае, у тебя есть список результатов results, делай с ним что хочешь.


К слову, у тебя очень кривой zip() в примере кода.
aList = "http://сайт-со-снепшотами.com"
bList = ['список',  'имен',  'для',  'снепшотов', 'и', 'так', 'далее'] 
    for a, b in zip(aList, bList):

У тебя zip() даст
('h', 'список'), ('t', 'имен'), ('t', 'для'), ('p', 'снепшотов'), (':', 'и'), ('/', 'так'), ('/', 'далее'), ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы