Pygithub: github.PaginatedList.PaginatedList totalCount return Ninguno

Creado en 2 jul. 2016  ·  14Comentarios  ·  Fuente: PyGithub/PyGithub

Mi pregunta es por qué invocar totalCount directamente devuelve Ninguno, pero iterar obtendrá el número.

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

Comentario más útil

Para las esencias:

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

Todos 14 comentarios

Pego mi codigo

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

Tengo otro problema, a veces obtengo un error de 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)

Hola,
Acerca de que su totalCount es Ninguno, tengo lo mismo con repo.get_pulls (). TotalCount.
Creo que el problema es que el JSON devuelto no contiene datos ['total_count'].
Quizás PaginatedList debería implementar __len__ con:

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

@pgmillon eso suena justo.
Si desea redactar un pequeño PR que haga eso, estaría dispuesto a fusionarlo.

Notado lo mismo, PaginatedList nunca establece totalCount. Devolver len de elementos no es lo que estoy buscando, quiero saber cuántos elementos hay realmente que se pueden recuperar.

De acuerdo, pero AFAIK, la API no da ninguna forma de saber eso. Entonces, la única forma es la presente solución alternativa:

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

Para las esencias:

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

Sigue siendo el mismo problema:

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

@ gil9red @Tigralt ¿Está tratando de obtener la cantidad total de elementos que se devuelven al iterar sobre PaginatedList? Si es así, no hay forma de hacerlo sin iterar sobre PaginatedList e incrementar un recuento. Consulte los documentos aquí (aunque son antiguos, son correctos)

GitHub no proporciona ninguna forma de saber la cantidad de elementos que devolverá una solicitud paginada, por lo que PaginatedList no tiene longitud:
...
Si realmente quiere tomar la longitud de una PaginatedList, debe construir explícitamente [sic] una lista y luego usar su longitud:

Si está tratando de obtener la cantidad de elementos en una página en PaginatedList, parece que este PR aún está abierto y se está discutiendo.

Analizando algunos problemas relacionados # 433 # 487 # 596

¿Supongo que total_count es de la antigua respuesta de la API de Github? ¿Debemos eliminar el atributo TotalCount en PaginatedList ya que su implementación está rota y siempre devuelve None ? En su lugar, podríamos agregar algo en los documentos como:

# 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

¿Y tal vez podamos implementar __len__ para devolver el recuento de elementos actual?

Creo que la API de Github devolverá la cantidad total de páginas para una consulta, por lo que si configura per_page=1 debería poder obtener la cantidad total de elementos de una sola solicitud. Esto puede ser mucho más eficiente que iterar (para conjuntos de resultados grandes).

@ Tommos0 Ya veo, esta es probablemente una buena idea. Incluso podemos hacer un HEAD lugar de GET solo para recuperar el encabezado Link .

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

Corregido en # 820

¿Fue útil esta página
0 / 5 - 0 calificaciones