Ho una collezione di oggetti Python, li chiamiamo frutti. Alcuni di questi frutti potrebbero essere difettosi. Per verificare questi errori, ho un numero di funzioni che esegue controlli diversi e restituisce un elenco di frutti che non ha superato il controllo:
def not_delicious(fruits, limit):
return fruit for fruit in fruits if fruit.tastyness < limit
def not_ripe(fruits):
return fruit for fruit in fruits if not fruit.ripe
Ora voglio avere un metodo che mi permetta di registrare in modo ordinato il risultato di questi controlli. Un approccio ingenuo assomiglia a questo:
def log_not_delicious(fruits, limit):
for fruit in not_delicious(fruits, limit):
log("The fruit {name} was not delicious enough.".format(**fruit))
def log_not_ripe(fruits):
for fruit in not_ripe(fruits):
log("The fruit {name} was not ripe.".format(**fruit))
Ecco un bel po 'di piastre. Per semplificare, vorrei una funzione log_check
che prenda l'assegno che voglio eseguire come input e quindi esegua il logging per me. Quindi posso usarlo in questo modo:
log_check(not_delicious, fruits, 7)
Tale funzione non dovrebbe essere così difficile da scrivere. Qualcosa in questo senso:
def log_check(check, fruit, *args, **kwargs):
for fruit in check(fruit, *args, **kwargs):
log(message.format(**fruit))
C'è solo un problema. In che modo log_check
sa cosa message
usare? Ho pensato a due soluzioni a questo, ma non mi piace nessuno di loro:
-
Inseriscilo come una proprietà sulla funzione
check
, quindi ho ad esempio:not_delicious.message = "The fruit {name} was not delicious enough."
Questo non sembra molto Pythonic - sembra più come JavaScript.
-
Utilizza invece una classe come funzione per
check
. Questo mi sembra un po 'eccessivo - mi è stato pensato che ho solo bisogno di usare una classe se ho uno stato interno. E non c'è stato qui - eseguo il controllo, e poi ho finito.
C'è una terza alternativa, o qual è il mio approccio migliore qui?