Потоковые пакеты данных из URL GitHub один за другим по запросу. - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь разобрать URL-адреса по одному, учитывая, что каждый вызов read () возвращает часть данных. У меня есть один владелец (учетная запись GitHub), одно или несколько хранилищ и один или несколько ресурсов (проблемы, фиксации и т. Д.). Класс должен выполнять итерацию каждой комбинации репозитория и ресурсов, когда пользователь вызывает read () многократно. Проблема заключается в том, что он не повторяет каждую комбинацию между владельцем, репозиториями и ресурсами. Вот мой код до сих пор:

import requests

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def read(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    json_res = result.json()
                    return json_res
                else:
                    print(result.text)
                    print(result.status_code)

gh = GitHub('example', ['example1', 'example2'], ['issues','pulls'])
data = gh.read()

UPDATE

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def create_list(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    json_res = result.json()
                    print(json_res)
                else:
                    print(result.text)
                    print(result.status_code)
                    break
                yield

gh = GitHub('moby', ['moby', 'buildkit'], ['issues','pulls'])
data = gh.create_list()
while data is not None:
    try:
        next(data)
        data = gh.create_list()
    except StopIteration:
        break

Мне только что удалось получить эту форму кода. Теперь, когда я пытаюсь выполнить код, он выполняет итерацию по тому же URL (.../moby/moby/issues), не принимая следующее значение из self.resources (в методе create_list). Где я не прав?

1 Ответ

0 голосов
/ 06 января 2019

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

  1. Вы yield не генерируете значение
  2. Вы звоните create_list(), как будто он производит все свои элементы одновременно.

Далее я изменил yield, чтобы сгенерировать dict с URL-адресом и результатом для текущего элемента. Затем я перебираю значения с помощью for, печатая URL каждого элемента и количество элементов в результате, возвращаемом из GitHub:

import requests

class GitHub():

    def __init__(self, owner, repositories, resources):
        self.owner = owner
        self.repositories = repositories
        self.resources = resources

    def create_list(self):
        for rep in self.repositories:
            for res in self.resources:
                url = 'https://api.github.com/repos/{}/{}/{}'.format(self.owner, rep, res)
                result = requests.get(url)
                if result.status_code == 200:
                    yield {'url': url, 'result': result.json()}

gh = GitHub('moby', ['moby', 'buildkit'], ['issues','pulls'])
for result in gh.create_list():
    print('url: {}\tlen(result): {}'.format(result['url'], len(result['result'])))

Выход:

url: https://api.github.com/repos/moby/moby/issues      len(result): 30
url: https://api.github.com/repos/moby/moby/pulls       len(result): 30
url: https://api.github.com/repos/moby/buildkit/issues  len(result): 30
url: https://api.github.com/repos/moby/buildkit/pulls   len(result): 8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...