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
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
Hilfreichster Kommentar
Für Kerne: