Najbardziej odpowiednia biblioteka Pythona dla Github API v3 [zamknięta]

85

Szukam odpowiedniej dla mnie biblioteki Pythona dla Github APIv3.

Znalazłem jedną bibliotekę (python-github3) wspomnianą w dokumentacji GH API . Po zabawie w ipythonie przez godzinę lub dwie stwierdziłem, że odkrywanie / praca z nim jest naprawdę nieintuicyjne. Rozejrzałem się trochę i stwierdziłem, że jest przynajmniej całkiem sporo osób, które próbują napisać taką bibliotekę. Bardziej obiecująco wyglądające (na pierwszy rzut oka) są PyGithub i kolejny python-github3 , który najwyraźniej różni się od pierwszego.

Zanim spędzę kolejne dni na wypróbowywaniu biblioteki po bibliotece, chciałem zapytać społeczność SO, czy istnieje akceptowany, ostateczny i oczywisty wybór dla tej biblioteki?

To, co mi się nie podobało w pierwszej bibliotece, to (dla mnie) nieintuicyjny sposób na dotarcie do danych - niektóre rzeczy otrzymujesz jako atrybuty, inne jako wartość zwracaną metody, ta wartość zwracana to jakiś skomplikowany obiekt, który musi być stronicowane i iterowane itp.

Pod tym względem PyGithub na pierwszy rzut oka wygląda atrakcyjniej - przejrzyj wyraźnie hierarchię obiektów, a następnie uzyskaj atrybut zawierający to, co chcesz:

for repo in g.get_user().get_repos(): print repo.name

Czy są więc jakieś perełki mądrości, którymi można się podzielić? Wiem, że nie mam wystarczających umiejętności, aby szybko ocenić jakość biblioteki, dlatego zwracam się do społeczności SO.

edit: fwiw, skończyło się na PyGithub . Działa dobrze, a autor jest bardzo otwarty na opinie i raporty o błędach. :-)

Christoph
źródło
Warto zapytać niektórych członków zespołu github.
Daenyth
6
fwiw, skończyło się na PyGithub. Działa dobrze, a autor jest bardzo otwarty na opinie i raporty o błędach. :-)
Christoph
Posortowałem wszystkie alternatywy według gwiazdek na GitHub, porównałem wyniki z tą odpowiedzią i wybrałem PyGithub. Obsługuje Python 3, wydaje się, że jest dobrze udokumentowany ... Nie mam czasu na wypróbowanie ich wszystkich i nie mam innego sposobu na podjęcie decyzji.
astrojuanlu

Odpowiedzi:

76

Ponieważ wspomniałeś, że jesteś początkującym programistą Pythona, sugerowałbym, abyś najpierw spróbował użyć API JSON bez żadnej biblioteki Github. To naprawdę nie jest takie trudne i pomoże ci to znacznie później w życiu programistycznym, ponieważ to samo podejście można zastosować do dowolnego interfejsu API JSON. Zwłaszcza jeśli wydaje się, że wypróbowanie bibliotek zajmie kilka dni.

Nie mówię, że niektóre biblioteki nie są łatwiejsze w użyciu, mówię tylko, że mały dodatkowy wysiłek związany z bezpośrednim używaniem API może być tego wart na dłuższą metę. Przynajmniej pomoże ci to zrozumieć, dlaczego niektóre z tych bibliotek wydają się „nieintuicyjne” (jak powiedziałeś).

Prosty przykład pobierania czasu utworzenia repozytorium django:

import requests
import json
r = requests.get('https://api.github.com/repos/django/django')
if(r.ok):
    repoItem = json.loads(r.text or r.content)
    print "Django repository created: " + repoItem['created_at']

Używa popularnej biblioteki żądań . W swoim kodzie będziesz oczywiście musiał zająć się również przypadkami błędów.

Jeśli potrzebujesz dostępu z uwierzytelnianiem, będzie to nieco bardziej złożone.

Lycha
źródło
11
+1 za wzmiankę requests, której wcześniej nie spotkałem. Wygląda fajnie.
larsks
btw, to powinno być r.content, a nie r.text(obiekt 'Response' nie ma atrybutu 'text')
Christoph
@Christoph r.textpowinien działać, jeśli odpowiedź to JSON. r.contentzwraca bajty bezpośrednio bez ich dekodowania. Wydaje się, że biblioteka żądań wewnętrznie używa (r.text or r.content)frazy, być może powinieneś to zrobić. Nie jestem pewien, dlaczego nie możesz zobaczyć textnieruchomości.
Lycha
Cóż, nie wiem, co się dzieje, ale umieściłem twój oryginalny przykład w ipythonie takim, jakim jest (z wyjątkiem korekty zniekształconych wcięć) i otrzymałemAttributeError: 'Response' object has no attribute 'text'
Christoph
Jeśli powiem json.loads(r.content or r.text)w redagowanym, to działa przy okazji.
Christoph
31

W końcu użyłem PyGithub . Działa dobrze, a autor jest bardzo otwarty na opinie i raporty o błędach. :-)

(Dostosowane z mojej zmiany do oryginalnego pytania, dla lepszej widoczności)

Christoph
źródło
15

Dokumentacja jest okropna dla PyGitHub, ale produkt jest świetny. Oto krótka próbka faktycznego pobierania pliku, zmieniania go z nowym komentarzem na początku pliku i zatwierdzania go z powrotem

from github import Github
gh = Github(login_or_token='.....', base_url='...../api/v3')
user = gh.get_user()
repo = user.get_repo("RepoName")
file = repo.get_file_contents("/App/forms.py")
decoded_content = "# Test " + "\r\n" + file.decoded_content
repo.update_file("/"RepoName"/forms.py", "Commit Comments", decoded_content, file.sha)
Steve
źródło
2
Czy to jest? Nie używałem go od wieków, ale afaik jest nadal utrzymywany - może otworzyć problem z tym? Przy okazji, PyGithub jest jednym z nielicznych przykładów udanego przekazania prac konserwacyjnych, w którym oryginalny twórca nie miał już czasu i poprosił o ochotników .
Christoph,
2
Dzięki za ten przykład, nie rozumiem, jak ktoś może spędzić miesiące rozwijając swój projekt i nie zawracam sobie głowy pisaniem kilku akapitów opisujących, jak z niego korzystać.
serg
Znalazłem dokumentację na pygithub.readthedocs.io/en/latest, która działała dobrze w tym, co musiałem zrobić. Dokumentacja może nie być dobrze utrzymana pod kątem najnowszych funkcji i może nie zawierała wszystkich przykładów, które chciałem (Google zajął się resztą), ale dla mnie działała dobrze.
aschultz
1

Libsa jest świetna dla początkujących. Ma ładną dokumentację i jest łatwy w użyciu, patrz przykład . Zapraszam do udziału.

DmitrySandalov
źródło