Ma question est de savoir pourquoi l'invocation de totalCount renvoie directement None, mais iterate obtiendra le nombre.
repo_commits = repo.get_commits()
repo_total = 0
for _ in repo_commits:
repo_total = repo_total + 1
repo_total = repo.get_commits().totalCount
je colle mon code
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()
J'ai un autre problème, parfois j'obtiens une erreur 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)
Salut,
À propos de votre totalCount étant None, j'ai la même chose avec repo.get_pulls().totalCount.
Je pense que le problème est que le JSON renvoyé ne contient pas de données ['total_count'].
Peut-être que la PaginatedList devrait implémenter __len__
avec :
if self.__totalCount:
return self.__totalCount
else:
return len(self.__elements)
@pgmillon ça a l'air juste.
Si vous voulez rédiger un petit PR qui fait ça, je serais prêt à le fusionner.
J'ai remarqué la même chose, PaginatedList ne définit jamais totalCount. Le renvoi d'éléments n'est pas ce que je recherche, je veux savoir combien d'éléments il y a réellement qui pourraient être récupérés.
D'accord, mais autant que je sache, l'API ne donne aucun moyen de le savoir. Le seul moyen est donc la solution de contournement actuelle :
opened_pulls = repository.get_pulls()
pulls_count = 0
# Fix no count available on pulls list
for _ in opened_pulls:
pulls_count += 1
Pour l'essentiel :
from github import Github
gh = Github()
gists = gh.get_user('gil9red').get_gists()
print(gists.totalCount) # None
print(len(list(gists))) # 7
Toujours le même problème :
from github import Github
g = Github()
repos = g.get_repos()
print(repos.totalCount) # None
@gil9red @Tigralt Essayez-vous d'obtenir le nombre total d'éléments renvoyés par l'itération sur la PaginatedList ? Si c'est le cas, il n'y a aucun moyen de le faire sans itérer sur la PaginatedList et incrémenter un nombre. Voir les documents ici (même s'ils sont anciens, ils sont corrects)
GitHub ne fournit aucun moyen de connaître le nombre d'éléments qu'une requête paginée retournera, donc PaginatedList n'a pas de longueur :
...
Si vous voulez vraiment prendre la longueur d'une PaginatedList, vous devez explicitement [sic] construire une liste et ensuite utiliser sa longueur :
Si vous essayez d'obtenir le nombre d'éléments sur une page dans la PaginatedList, il semble que ce PR soit toujours ouvert et en cours de discussion.
Examen de quelques problèmes connexes #433 #487 #596
Je suppose que le total_count
provient de l'ancienne réponse de l'API Github ? Devons-nous supprimer l'attribut TotalCount
sur PaginatedList
puisque son implémentation est cassée et renvoie toujours None
. Au lieu de cela, nous pourrions ajouter quelque chose dans la documentation comme :
# 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
Et peut-être pouvons-nous implémenter le __len__
pour renvoyer le nombre d'éléments actuel ?
Je pense que l'API Github renverra le nombre total de pages pour une requête, donc si vous définissez per_page=1
vous devriez pouvoir obtenir le nombre total d'éléments à partir d'une seule requête. Cela peut être beaucoup plus efficace que l'itération (pour les grands ensembles de résultats).
@Tommos0 Je vois, c'est probablement une bonne idée. On peut même faire un HEAD
au lieu de GET
juste pour récupérer l'en-tête Link
.
Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.
Corrigé dans #820
Commentaire le plus utile
Pour l'essentiel :