W pełni zdaję sobie sprawę, że pylint
i inne narzędzia analizy statycznej nie są wszechwiedzące, a czasem ich radom należy się nie posłuchać. (Dotyczy to różnych klas wiadomości, nie tylko convention
s.)
Jeśli mam zajęcia takie jak
class related_methods():
def a_method(self):
self.stack.function(self.my_var)
class more_methods():
def b_method(self):
self.otherfunc()
class implement_methods(related_methods, more_methods):
def __init__(self):
self.stack = some()
self.my_var = other()
def otherfunc(self):
self.a_method()
Oczywiście jest to wymyślone. Oto lepszy przykład, jeśli chcesz .
Uważam, że ten styl nazywa się przy użyciu „miksów”.
Podobnie jak inne narzędzia, pylint
ocenia ten kod na -21.67 / 10
, przede wszystkim dlatego, że myśli more_methods
i related_methods
nie ma self
atrybutów otherfunc
, a także dlatego stack
, my_var
że bez uruchomienia kodu najwyraźniej nie widzi related_methods
i nie more_methods
jest w to zamieszany implement_methods
.
Kompilatory i narzędzia do analizy statycznej nie zawsze mogą rozwiązać problem zatrzymania , ale uważam, że jest to z pewnością przypadek, w którym sprawdzenie, co odziedziczyłoby implement_methods
, pokazałoby, że jest to całkowicie poprawne, i to byłoby bardzo łatwe.
Dlaczego narzędzia analizy statycznej odrzucają ten prawidłowy (myślę) wzór OOP?
Zarówno:
Nie próbują nawet sprawdzać dziedziczenia lub
mixiny są odradzane w idiomatycznym, czytelnym Pythonie
# 1 jest oczywiście niepoprawny, ponieważ jeśli poproszę pylint
o powiedzenie mi o klasie, która dziedziczy, unittest.TestCase
że używa self.assertEqual
((coś zdefiniowanego tylko w unittest.TestCase
)), to nie narzeka.
Czy miksy są niepytoniczne czy zniechęcone?