I, un principiante, sto lavorando su una semplice GUI basata su schede. scritto in Python. Esiste una classe base che, tra le altre cose, consiste in un vocabolario di tutte le carte, come _cards = {'card1_ID': card1, 'card2_ID': card2}
. Le carte sulla GUI sono referenziate dai loro ID univoci.Catching della stessa aspettativa in tutti i metodi di una classe
Poiché ho intenzione di rendere il codice disponibile per altri principianti, desidero informarli esplicitamente se hanno fornito un ID tessera che non esiste (invece di lanciare un KeyError). Ora ho un sacco di ripetitivo clausola try-aspettarsi che mi rende sospettoso:
parte del codice, i metodi a una linea senza provare-catching:
def shift(self, card_ID, amount):
"""Moves the card by the given amount of pixels.
:param amount: the horizontal and vertical amount of shifting in pixels; tuple"""
try:
self._cards[card_ID].shift(amount)
except KeyError:
raise ValueError("Invaild card ID")
def align(self, card_ID, horizontal, vertical):
"""Aligns the card to the given position."""
try:
card = self._cards[card_ID]
card.align(horizontal, vertical)
except KeyError:
raise ValueError("Invaild card ID")
def invert(self, card_ID):
"""Inverts the card's colour"""
try:
self._cards[card_ID].invert()
except KeyError:
raise ValueError("Invaild card ID")
È questo una pratica accettata? C'è un modo migliore per catturare questo KeyError in ogni metodo della classe?
Considerare un [decoratore] (http://thecodeship.com/patterns/guide-to-python-function-decorators/) – khelwood
Un altro approccio verrà sovrascritto \ __ getitem \ __ dell'istanza _cards. –
C'è un motivo per cui usi un oggetto per la tua collezione di carte che solleva un "KeyError" quando quello che vuoi è un "Errore di Valore"? O in alternativa, perché vuoi un 'ValueError' in primo luogo? Perché non catturare un "KeyError" piuttosto che un "ValueError" nel punto del codice che sta facendo uso della tua classe? Se il problema è il messaggio di errore personalizzato, probabilmente la cosa migliore da fare è creare il proprio tipo 'CardsCollection' con il proprio messaggio di errore integrato. –