Pygithub: github.PaginatedList.PaginatedList totalCount kembali Tidak ada

Dibuat pada 2 Jul 2016  ·  14Komentar  ·  Sumber: PyGithub/PyGithub

Pertanyaan saya adalah mengapa memanggil totalCount secara langsung mengembalikan None, tetapi iterate akan mendapatkan nomornya.

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

Komentar yang paling membantu

Untuk intinya:

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

Semua 14 komentar

Saya menempelkan kode saya

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

Saya memiliki masalah lain, terkadang saya akan mendapatkan kesalahan 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)

Hai,
Tentang totalCount Anda menjadi Tidak Ada, saya memiliki hal yang sama dengan repo.get_pulls().totalCount.
Saya pikir masalahnya adalah JSON yang dikembalikan tidak berisi data['total_count'].
Mungkin PaginationList harus mengimplementasikan __len__ dengan :

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

@pgmillon kedengarannya adil.
Jika Anda ingin menyusun PR kecil yang melakukan itu, saya bersedia menggabungkannya.

Melihat hal yang sama, PaginationList tidak pernah menetapkan totalCount. Mengembalikan len elemen bukanlah yang saya cari, saya ingin tahu berapa banyak item sebenarnya yang bisa diambil.

Setuju tetapi AFAIK API tidak memberikan cara apa pun untuk mengetahuinya. Jadi satu-satunya cara adalah solusi saat ini:

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

Untuk intinya:

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

Masih masalah yang sama:

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

@ gil9red @Tigralt Apakah Anda mencoba untuk mendapatkan jumlah total item yang dikembalikan dari iterasi melalui PaginationList? Jika demikian, tidak ada cara untuk melakukannya tanpa mengulangi PaginasiList dan menambah hitungan. Lihat dokumen di sini (meskipun sudah tua mereka benar)

GitHub tidak memberikan cara untuk mengetahui jumlah item yang akan dikembalikan oleh permintaan paginasi, jadi PaginasiList tidak memiliki panjang:
...
Jika Anda benar-benar bermaksud mengambil panjang dari PaginationList, Anda harus secara eksplisit [sic] membuat daftar dan kemudian menggunakan panjangnya:

Jika Anda mencoba untuk mendapatkan jumlah item pada satu halaman di Daftar Paginasi, sepertinya PR ini masih terbuka dan sedang dibahas.

Melihat beberapa masalah terkait #433 #487 #596

Saya kira total_count berasal dari respons API Github lama? Haruskah kita menghapus atribut TotalCount pada PaginatedList karena implementasinya rusak dan selalu mengembalikan None . Sebagai gantinya, kita bisa menambahkan sesuatu di dokumen seperti:

# 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

Dan mungkin kita dapat menerapkan __len__ untuk mengembalikan jumlah elemen saat ini?

Saya pikir Github API akan mengembalikan jumlah total halaman untuk kueri, jadi jika Anda menetapkan per_page=1 Anda harus bisa mendapatkan jumlah total item dari satu permintaan. Ini bisa menjadi jauh lebih efisien daripada iterasi (untuk set hasil yang besar).

@ Tommos0 begitu, ini mungkin ide yang bagus. Kita bahkan dapat melakukan HEAD daripada GET hanya untuk mengambil header Link .

Masalah ini secara otomatis ditandai sebagai basi karena tidak ada aktivitas terbaru. Ini akan ditutup jika tidak ada aktivitas lebih lanjut yang terjadi. Terima kasih atas kontribusi Anda.

Diperbaiki di #820

Apakah halaman ini membantu?
0 / 5 - 0 peringkat