Pygithub: github.PaginatedList.PaginatedList totalCount return Aucun

Créé le 2 juil. 2016  ·  14Commentaires  ·  Source: PyGithub/PyGithub

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

Commentaire le plus utile

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

Tous les 14 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes