Wpis z mikrobloga

Hej, mam szybkie pytanie do #python. Jak można szybko i prosto zrobić walidację dwóch atrybutów klasy, gdzie występuje zależność między nimi, iż jeden nie może być większy od drugiego? Dam szybki przykład krótkiego kodu poniżej:

def ClassExample(self,attr1, attr2):
_init(self, attr1, attr2)

self.attr1 = attr1
self.attr2 = attr2

@staticmethod
def validate
attr1vsattr2(attr1,attr2):
if attr1 < attr2:
return False
return True

Teraz jak próbuję zrobić właściwości, w ktorych chciałbym zgłosić wyjątek gdy validateAttr1vsAttr2(attr1,attr2) == False
jednakże pylint pokazuje mi błąd, gdy robie @property def attr1 i @attr1.setter dla attr1 to wyświetla bład: brakuje atrybutu attr2 a jak dodam ten atrybut w @attr1.setter to błąd przenosi się do metody _init_

#naukaprogramowania
  • 5
@mactrix: Możesz napisać to sprawdzanie przy użyciu try, żeby obsługiwało wyjątek, gdy dopiero inicjujesz klasę. Możesz dodać atrybuty klasy o takich samych nazwach, żeby istniały przed inicjalizacją. Ale najprościej będzie w __init__ podstawiać wartości domyślne albo None, a zmieniać je osobną metodą, która będzie walidowała poprawność.
@ProfesorBigos: Łapię, wiem już co zrobię z tym _init_ dam attrybuty domyślne i poproszę użytkownika o to by podał wartości jakie chciałby zobaczyć i dopiero po ich walidacji staną się atrybutami (chodzi mi tu o taki mniej więcej przykład: średnica obiektywu i ogniskowa obiektywu, nie chcę by F ogniskowa/średnica był mniejszy niż 1) . Dzięki za pomoc!
@mactrix: Nie ma za co. W pythonie czasami tak jest, że szukamy rozwiązania w tych wszystkich zaawansowanych narzędziach, a okazuje się, że najprościej jest rozwiązać problem przy użyciu młotka i ewentualnie dopisać komentarz z wyjaśnieniem :-D
@mactrix: BTW możesz przypisać wartość condition statement do zmiennej. chyba bardziej czytelne będzie

def x(atr1, atr2):
output = atr1 < atr2
return output

niż podwójny return jeden pod drugim. Możesz równie dobrze zwrócić od razu wartość condition statement