Pygithub: github.PaginatedList.PaginatedList totalCount return None

Созданный на 2 июл. 2016  ·  14Комментарии  ·  Источник: PyGithub/PyGithub

Мой вопрос в том, почему вызов totalCount напрямую возвращает None, но итерация получит номер.

            repo_commits = repo.get_commits()
            repo_total = 0
            for _ in repo_commits:
                repo_total = repo_total + 1
            repo_total = repo.get_commits().totalCount

Самый полезный комментарий

По сути:

    from github import Github
    gh = Github()
    gists = gh.get_user('gil9red').get_gists()
    print(gists.totalCount)  # None
    print(len(list(gists)))  # 7

Все 14 Комментарий

Я вставляю свой код

import json
import os

import github
from github import Github

# First create a Github instance:

g = Github("grapebaba", "heatonn1",per_page=1000)


def main():
    '''
    Use small data for this application
    :return:
    '''
    with open(os.path.join(os.path.expanduser("~"),'recruitbot_data.txt'),'w') as f:
        for user in g.search_users("type:user")[0:10000]:
            user_dict = {}
            user_dict['username'] = user.login
            user_dict['id'] = user.id
            user_dict['profile_url'] = user.html_url
            user_dict['location'] = user.location
            user_dict['followers'] = user.followers
            user_dict['private_gists'] = user.private_gists
            user_dict['public_gists'] = user.public_gists
            user_dict['name'] = user.name
            user_dict['company'] = user.company
            user_dict['blog_url'] = user.blog
            user_dict['email'] = user.email
            user_dict['id'] = user.id
            user_dict['contributions']={}
            for repo in user.get_watched():
                try:
                    repo_total = 0
                    for _ in repo.get_commits():
                        repo_total = repo_total + 1
                    if repo.get_stats_contributors() is not None:
                        for contributor in repo.get_stats_contributors():
                            if contributor is not None and contributor.author.id == user_dict['id']:
                                user_dict['contributions'][repo.name]={}
                                user_dict['contributions'][repo.name]['contributor_commits']=contributor.total
                                user_dict['contributions'][repo.name]['repo_commits']=repo_total
                                user_dict['contributions'][repo.name]['language']=repo.language
                                user_dict['contributions'][repo.name]['stars']=repo.stargazers_count
                                print user_dict
                                break
                except github.GithubException as e:
                    print e

            f.write(json.dumps(user_dict)+"\n")

if __name__ == '__main__':
    main()

У меня другая проблема, иногда я получаю ошибку SSL

Traceback (most recent call last):
  File "/tmp/collector.py", line 54, in <module>
    main()
  File "/tmp/collector.py", line 36, in main
    for _ in repo.get_commits():
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 48, in __iter__
    newElements = self._grow()
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 60, in _grow
    newElements = self._fetchNextPage()
  File "/usr/local/lib/python2.7/dist-packages/github/PaginatedList.py", line 161, in _fetchNextPage
    headers=self.__headers
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 171, in requestJsonAndCheck
    return self.__check(*self.requestJson(verb, url, parameters, headers, input, cnx))
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 212, in requestJson
    return self.__requestEncode(cnx, verb, url, parameters, headers, input, encode)
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 251, in __requestEncode
    status, responseHeaders, output = self.__requestRaw(cnx, verb, url, requestHeaders, encoded_input)
  File "/usr/local/lib/python2.7/dist-packages/github/Requester.py", line 281, in __requestRaw
    output = response.read()
  File "/usr/lib/python2.7/httplib.py", line 557, in read
    s = self._safe_read(self.length)
  File "/usr/lib/python2.7/httplib.py", line 664, in _safe_read
    chunk = self.fp.read(min(amt, MAXAMOUNT))
  File "/usr/lib/python2.7/socket.py", line 380, in read
    data = self._sock.recv(left)
  File "/usr/lib/python2.7/ssl.py", line 341, in recv
    return self.read(buflen)
  File "/usr/lib/python2.7/ssl.py", line 260, in read
    return self._sslobj.read(len)

Привет,
Что касается вашего totalCount, равного None, у меня то же самое с repo.get_pulls (). TotalCount.
Я думаю, проблема в том, что возвращенный JSON не содержит данных ['total_count'].
Возможно, PaginatedList должен реализовать __len__ с:

if self.__totalCount:
    return self.__totalCount
else:
   return len(self.__elements)

@pgmillon , звучит честно.
Если вы хотите составить крошечный PR, который сделает это, я бы с удовольствием его объединил.

Заметили то же самое, PaginatedList никогда не устанавливает totalCount. Я не ищу возвращение len элементов, я хочу знать, сколько элементов на самом деле можно получить.

Согласен, но AFAIK API не дает возможности узнать об этом. Итак, единственный способ - это нынешний обходной путь:

opened_pulls = repository.get_pulls()
pulls_count = 0
# Fix no count available on pulls list
for _ in opened_pulls:
    pulls_count += 1

По сути:

    from github import Github
    gh = Github()
    gists = gh.get_user('gil9red').get_gists()
    print(gists.totalCount)  # None
    print(len(list(gists)))  # 7

По-прежнему та же проблема:

from github import Github
g = Github()
repos = g.get_repos()
print(repos.totalCount) # None

@ gil9red @Tigralt Вы пытаетесь получить общее количество элементов, возвращенных в результате итерации по PaginatedList? Если так, то это невозможно сделать без итерации по PaginatedList и увеличения счетчика. Смотрите здесь документы (даже если они старые, но правильные)

GitHub не предоставляет способа узнать количество элементов, которые вернет запрос с разбивкой на страницы, поэтому PaginatedList не имеет длины:
...
Если вы действительно хотите взять длину PaginatedList, вы должны явно [sic] создать список, а затем использовать его длину:

Если вы пытаетесь получить количество элементов на одной странице в PaginatedList, похоже, что этот PR все еще открыт и обсуждается.

Рассмотрение нескольких связанных вопросов # 433 # 487 # 596

Я предполагаю, что total_count из старого ответа Github API? Должны ли мы удалить атрибут TotalCount в PaginatedList поскольку его реализация нарушена и всегда возвращает None . Вместо этого мы могли бы добавить в документы что-нибудь вроде:

# To get the total number of available elements in PaginatedList
repos = g.get_user().get_repos()
print(len(list(repos)))  # we can't avoid to iterate through the whole set to get total count

И, может быть, мы сможем реализовать __len__ чтобы возвращать текущее количество элементов?

Я думаю, что Github API вернет общее количество страниц для запроса, поэтому, если вы установите per_page=1 вы сможете получить общее количество элементов из одного запроса. Это может быть намного эффективнее, чем итерация (для больших наборов результатов).

@ Tommos0 Понятно , это, наверное, хорошая идея. Мы даже можем сделать HEAD вместо GET просто чтобы получить заголовок Link .

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

Исправлено в # 820

Была ли эта страница полезной?
0 / 5 - 0 рейтинги