Quando avere un metodo generico per più attività quando alcune differiscono?

1

Elaboro molti tweet in tempo reale usando python e per ogni tweet ho bisogno di assegnarlo a un bucket specifico. Ho circa 50 secchi, ognuno con le proprie regole. La maggior parte di loro sono semplici come così

bucket_one = ['test', 'foo']
if any(x in tweet['text'] for x in bucket_one):
  tweet['bucket_one'] = 1

Quindi il modo in cui l'ho progettato è avere un dizionario in cui la chiave è il nome del bucket e il valore è un elenco di termini che dovrebbero essere presenti. In questo modo posso avere 1 metodo generico che assegnerebbe il tweet a un bucket scorrendo attraverso il dict.

Il mio problema è che alcuni bucket hanno regole più complicate come:

if 'boo' in tweet['text'] and not any(y in tweet['text'] for y in no_words):
  tweet['bucket_two'] = 1

Quindi, come vedi, ho un modo pulito ed elegante (secondo me e per favore mi sfida se riesci a pensare a un modo migliore) di assegnare i bucket facili, tuttavia ci sono circa 10 bucket con regole più complesse che differiscono.

Va bene avere 1 metodo generico per 40 bucket e poi avere un singolo metodo per l'altro bucket più complesso? o dovrei avere solo 50 metodi individuali?

    
posta Mo. 16.06.2016 - 17:55
fonte

1 risposta

4

Penso che un modo molto gestibile sarebbe quello di definire le funzioni che prendono un tweet e restituiscono un booleano come questo:

def has_terms(*terms):
    return lambda tweet: any(term in tweet['text'] for term in terms)

def complex_rule(tweet):
    return 'boo' in tweet['text'] and not any(y in tweet['text'] for y in no_words)

Quindi puoi impostare il tuo elenco di regole come questa:

rules = [(has_terms('test', 'foo'), 'bucket_one'),
         (complex_rule, 'bucket_two')]

Quindi l'assegnazione dei bucket è simile a questa:

for rule, bucket in rules:
     if rule(tweet):
         tweet[bucket] = 1

Questo semplifica la separazione tra l'implementazione delle regole, le specifiche del tuo elenco di regole e l'applicazione dell'elenco di regole a un tweet.

    
risposta data 16.06.2016 - 23:22
fonte

Leggi altre domande sui tag