Храните данные и используйте их в Android Studio

Если extract_ds_job_url(get_ds_jobs(BASE_JOB_URL)) возвращает пустой набор, вы навсегда назовете get_all_downstream_jobs_urls(temp). Это потому, что цикл for ничего не собирается делать.

Тест наверху должен проверить вместо None:

if ds_jobs is None:

и отдельный тест для ds_jobs, должно быть завершено рекурсией:

if not ds_jobs:
    # no downstream jobs to process
    return set()

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

  • JENKINS_JOBS никогда не восстанавливается, поэтому global JENKINS_JOBS является избыточным и запутанным и должен удаляться.
  • Неясно, почему функция обновляет глобальные и возвращает результирующий набор. Он должен делать одно или другое, а не то, и другое.
  • _ является по соглашению , переменной выброса. Он сигнализирует, что значение не будет использоваться. Однако здесь код использует . Его следует переименовать вместо job_url.
  • Вы действительно никогда не должны использовать ; в производственном коде.
  • ds_jobs = set(), тогда ds_jobs.update(...) является слишком верным написанием ds_jobs = set(...).
  • temp не является хорошим именем переменной, updated может быть лучшим именем. Он должен быть сделан при назначении, поэтому updated = set(ds_jobs), а вызов .copy() можно удалить из цикла for.
  • return, когда первый URL-адрес задания не имеет нисходящие URL-адреса, вероятно, не то, что вы хотите.
  • Если вы действительно хотите дерево нисходящих URL-адресов, рекурсивный вызов должен not попытаться передать все URL-адреса, собранные до сих пор! Вероятно, снова и снова будет обращаться к API-интерфейсу jenkins для URL-адреса заданий, который уже был проверен.

Следующий код удаляет рекурсию с использованием стека вместо этого и гарантированно вызывает вызов Jenkins API для каждого URL-адреса задания только один раз :

def get_all_downstream_jobs_urls():
    ds_jobs = set()
    stack = [extract_ds_job_url(get_ds_jobs(BASE_JOB_URL))]
    while stack:
        job_url = stack.pop()
        if job_url in ds_jobs:
            # already seen before, skip
            continue
        ds_jobs.add(job_url)
        # add downstream jobs to the stack for further processing
        stack.extend(extract_ds_job_url(get_ds_jobs(job_url)))
    return ds_jobs

Последнее, но не менее важное, я сильно подозреваю, что использование сторонней библиотеки, такой как пакет jenkinsapi сделает все это еще проще; API Jenkins, вероятно, позволяет вам запрашивать эту информацию всего за один вызов, но библиотека, вероятно, делает такой вызов для вас и предоставляет вам легко анализируемые объекты Python для информации.

-1
задан jacob spens 19 January 2019 в 18:58
поделиться

1 ответ

Я бы порекомендовал установить свою собственную базу данных на сервере с подсчетом «нравится и не нравится» и веб-сервисами, которые действительно нравятся и не нравятся, так как похоже, что вы хотите, чтобы это было многопользовательское приложение и подключенное к Интернету.

Буду признателен, если вы добавите больше подробностей о том, как вы хотите его реализовать, чтобы дать вам лучший ответ.

0
ответ дан Alonso Mondal 19 January 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: