Pygithub: github.PaginatedList.PaginatedList totalCount Rückgabe Keine

Erstellt am 2. Juli 2016  ·  14Kommentare  ·  Quelle: PyGithub/PyGithub

Meine Frage ist, warum das Aufrufen von totalCount direkt None zurückgibt, aber iterate wird die Nummer erhalten.

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

Hilfreichster Kommentar

Für Kerne:

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

Alle 14 Kommentare

Ich füge meinen Code ein

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()

Ich habe ein anderes Problem, manchmal erhalte ich einen SSL-Fehler

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)

Hallo,
Da Ihr totalCount None ist, habe ich das gleiche mit repo.get_pulls().totalCount.
Ich denke, das Problem ist, dass die zurückgegebene JSON keine Daten enthält ['total_count'].
Vielleicht sollte die PaginatedList __len__ mit implementieren:

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

@pgmillon das klingt fair.
Wenn Sie eine kleine PR erstellen möchten, die dies tut, wäre ich bereit, sie zusammenzuführen.

Das gleiche ist aufgefallen, PaginatedList setzt niemals totalCount. Das Zurückgeben von Elementen ist nicht das, was ich suche, ich möchte wissen, wie viele Artikel tatsächlich abgerufen werden können.

Einverstanden, aber AFAIK gibt die API keine Möglichkeit, das zu wissen. Der einzige Weg ist also der jetzige Workaround:

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

Für Kerne:

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

Immer noch das gleiche Problem:

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

@gil9red @Tigralt Versuchen Sie, die Gesamtzahl der Elemente abzurufen, die beim Durchlaufen der PaginatedList zurückgegeben werden? Wenn dies der Fall ist, gibt es keine Möglichkeit, dies zu tun, ohne die PaginatedList zu durchlaufen und einen Zähler zu erhöhen. Siehe Dokumente hier (obwohl sie alt sind, sind sie korrekt)

GitHub bietet keine Möglichkeit, die Anzahl der Elemente zu ermitteln, die eine paginierte Anfrage zurückgibt, daher hat PaginatedList keine Länge:
...
Wenn Sie wirklich die Länge einer PaginatedList nehmen möchten, müssen Sie explizit eine Liste erstellen und dann ihre Länge verwenden:

Wenn Sie versuchen, die Anzahl der Elemente auf einer Seite in der PaginatedList abzurufen, scheint diese PR noch offen zu sein und wird diskutiert.

Betrachten Sie einige verwandte Probleme #433 #487 #596

Ich denke, das total_count stammt aus der alten Github-API-Antwort? Sollen wir das TotalCount Attribut von PaginatedList entfernen, da seine Implementierung fehlerhaft ist und immer None zurückgibt. Stattdessen könnten wir den Dokumenten etwas hinzufügen wie:

# 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

Und vielleicht können wir __len__ implementieren, um die aktuelle Elementanzahl zurückzugeben?

Ich denke, die Github-API gibt die Gesamtzahl der Seiten für eine Abfrage zurück. Wenn Sie also per_page=1 festlegen, sollten Sie in der Lage sein, die Gesamtzahl der Elemente aus einer einzigen Anfrage zu erhalten. Dies kann viel effizienter sein als eine Iteration (bei großen Ergebnismengen).

@ Tommos0 Ich HEAD anstelle von GET ausführen, nur um den Link Header abzurufen.

Dieses Problem wurde automatisch als veraltet markiert, da es in letzter Zeit keine Aktivität hatte. Es wird geschlossen, wenn keine weitere Aktivität stattfindet. Vielen Dank für Ihre Beiträge.

Behoben in #820

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

BBI-YggyKing picture BBI-YggyKing  ·  5Kommentare

surajjacob picture surajjacob  ·  4Kommentare

jacquev6 picture jacquev6  ·  3Kommentare

PeterJCLaw picture PeterJCLaw  ·  6Kommentare

grayaii picture grayaii  ·  4Kommentare