Minha pergunta é por que invocar totalCount retorna nenhum diretamente, mas iterate obterá o 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
Eu colo meu código
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()
Eu tenho outro problema, às vezes recebo um erro 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)
Oi,
Sobre seu totalCount ser Nenhum, tenho o mesmo com repo.get_pulls (). TotalCount.
Acho que o problema é que o JSON retornado não contém dados ['total_count'].
Talvez a PaginatedList deva implementar __len__
com:
if self.__totalCount:
return self.__totalCount
else:
return len(self.__elements)
@pgmillon isso parece justo.
Se você quiser redigir um minúsculo RP que faça isso, estou disposto a mesclá-lo.
Observado a mesma coisa, PaginatedList nunca define totalCount. Retornar len de elementos não é o que estou procurando, quero saber quantos itens existem realmente que podem ser buscados.
Concordo mas a AFAIK a API não dá como saber disso. Portanto, a única maneira é a presente solução alternativa:
opened_pulls = repository.get_pulls()
pulls_count = 0
# Fix no count available on pulls list
for _ in opened_pulls:
pulls_count += 1
Para as principais:
from github import Github
gh = Github()
gists = gh.get_user('gil9red').get_gists()
print(gists.totalCount) # None
print(len(list(gists))) # 7
Continua o mesmo problema:
from github import Github
g = Github()
repos = g.get_repos()
print(repos.totalCount) # None
@ gil9red @Tigralt Você está tentando obter o número total de itens retornados da iteração na PaginatedList? Nesse caso, não há como fazer isso sem iterar a PaginatedList e incrementar uma contagem. Veja os documentos aqui (embora sejam antigos, estão corretos)
O GitHub não fornece nenhuma maneira de saber o número de itens que uma solicitação paginada retornará, portanto, PaginatedList não tem comprimento:
...
Se você realmente pretende obter o comprimento de uma PaginatedList, deve explicitamente [sic] construir uma lista e, em seguida, usar seu comprimento:
Se você está tentando obter o número de itens em uma página na PaginatedList, parece que este PR ainda está aberto e sendo discutido.
Olhando alguns problemas relacionados # 433 # 487 # 596
Eu acho que total_count
é da antiga resposta da API do Github? Devemos remover o atributo TotalCount
em PaginatedList
pois sua implementação é interrompida e sempre retorna None
. Em vez disso, poderíamos adicionar algo nos 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
E talvez possamos implementar __len__
para retornar a contagem de elementos atual?
Acho que a API do Github retornará a quantidade total de páginas para uma consulta, portanto, se você definir per_page=1
, poderá obter o número total de itens de uma única solicitação. Isso pode ser muito mais eficiente do que iterar (para grandes conjuntos de resultados).
@ Tommos0 Estou a ver, provavelmente é uma boa ideia. Podemos até fazer HEAD
vez de GET
apenas para recuperar o cabeçalho Link
.
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.
Fixo em # 820
Comentários muito úteis
Para as principais: