2009-12-30 11 views
5

Jak rozumiem, Python (2.5.2) nie ma prawdziwej obsługi klas abstrakcyjnych. Dlaczego pylin narzeka, że ​​ta klasa jest "klasą abstrakcyjną, a nie referencją?" Czy zrobi to dla każdej klasy, która ma wyrzuconą NotImplementedError?Co sprawia, że ​​pylin myśli, że moja klasa jest abstrakcyjna?

Mam każdą klasę w swoim pliku, więc jeśli tak jest, to sądzę, że nie mam innego wyjścia, jak tylko stłumić tę wiadomość, ale mam nadzieję, że jest inny sposób.

"""Package Repository interface.""" 


class PackageRepository(object): 
    """Package Repository interface.""" 

    def __init__(self): 
     self.hello = "world" 

    def get_package(self, package_id): 
     """ 
     Get a package by ID. 
     """ 
     raise NotImplementedError(\ 
       "get_package() method has not been implemented") 

    def get_packages(self): 
     """ 
     Get all packages. 
     """ 
     raise NotImplementedError(\ 
       "get_packages() method has not been implemented") 

    def commit(self): 
     """ 
     Commit all changes. 
     """ 
     raise NotImplementedError(\ 
       "commit() method has not been implemented") 

    def do_something(self): 
     """ 
     Doing something. 
     """ 
     return self.hello 

EDIT

Może powinienem wyjaśnić. Zdaję sobie sprawę, że jest to klasa abstrakcyjna i chciałbym użyć słowa kluczowego abstract, ale jak rozumiem, nie ma to znaczenia w Pythonie (przynajmniej w wersji, której aktualnie używam), więc nie zawracałem sobie głowy robieniem zabawnych abstrakcyjnych sztuczek (jak te found here) i po prostu go pominięto.

Zaskoczyło mnie, że pylinta podchodzi do faktu, że jest to klasa abstrakcyjna sama. Co decyduje o tym, że pylint jest klasą abstrakcyjną? Czy po prostu szuka gdzieś rzuconego NotImplementedError?

+6

Co sprawia, że ​​mówisz, że to nie ** streszczenie? Na pewno nie można go używać w obecnej postaci. Zgłasza wyjątki dla każdej funkcji metody. Co rozumiesz przez "streszczenie", jeśli nie jest to przykład? –

+0

To jest mylące dla mnie, że Python nie obsługuje klas abstrakcyjnych, ale pylint będzie narzekał, jeśli jest zdefiniowany, ale nie jest wymieniony w tym samym pliku. Zastanawiam się, czy robię coś złego, które uruchamia to ostrzeżenie. Wolę mieć wszystkie moje klasy we własnych plikach, więc jestem zobowiązany do natknięcia się na to często i chciałbym się dowiedzieć, czy jest coś, co powinienem robić więcej Python, który pomógłby mi obejść to ostrzeżenie. –

+1

@Beau Simensen: Dlaczego koncentrujesz się na jednej klasie na plik. To bardzo nie-Pythoniczne. Rzeczywiście, to jest podstawowa przyczyna twojego problemu. Nikt (szczególnie nie pylint) nie spodziewa się jednej klasy na plik. Dlaczego robisz to w ten sposób? Zaktualizuj swoje pytanie, wyjaśniając, dlaczego to robisz. –

Odpowiedz

1

Z mojego doświadczenia wynika, że ​​pylint jest nieco nadgorliwy i nie przydaje się, dopóki nie wyłączysz kilku ostrzeżeń.

+0

Jakie ostrzeżenia zaleciłbyś wyłączyć? –

12

FWIW, podnoszenie NotImplementedError wystarczy, aby pylint uważał, że jest to klasa abstrakcyjna (co jest absolutnie poprawne). from logilab.org/card/pylintfeatures: W0223: Metoda% r jest abstrakcyjna w klasie% r, ale nie jest nadpisywana Używane, gdy metoda abstrakcyjna (np. notewizowanie nagłówka NotImplementedError) nie jest nadpisana w konkretnej klasie. - Tobiesque 2 godziny temu

+0

Wskazówka dla @Tobiesque: Opublikuj odpowiedź i uzyskaj reputację. W ten sposób mogę usunąć tę odpowiedź na Twoją. –

+0

To może być trochę za dużo. Używam ładnych rzeczy w module 'abc' do definiowania abstrakcyjnych klas i metod, a ja używam' NotImplementedError' dla rzeczy, które nie zostały jeszcze zaimplementowane. –

Powiązane problemy