Sto cercando di capire una buona pratica per la progettazione di una funzione con (molti) componenti opzionali.
Per un esempio specifico, dì che sono interessato a progettare una funzione feature extractor che prende come input un documento e restituisce un elenco di funzionalità estratte dal documento.
Domanda
Se ci sono molti componenti opzionali, quale tipo di approccio sarebbe considerato di buona pratica e scalabile?
Qui di seguito sono un paio di opzioni che sono stato in grado di pensare, anche se potrebbero esserci altri approcci che non ho considerato.
Metodo 1: basato sulla classe
class FeatureExtractor(object):
"""Extract features from text for use in classification."""
def __init__(self, term_frequency=False, consider_negation=False,
pos_tags=False):
self.term_frequency = term_frequency
self.consider_negation = consider_negation
self.pos_tags = pos_tags
# Could be many more ...
def extract(self, document):
"""Extract features from a document."""
features = []
if self.term_frequency:
features.extend(self.extract_term_frequency(document))
if self.consider_negation:
features.extend(self.extract_negation(document))
if self.pos_tags:
features.extend(self.extract_pos_tags(document))
return features
def extract_term_frequency(self, document):
pass
def extract_negation(self, document):
pass
def extract_pos_tags(self, document):
pass
extractor = FeatureExtractor(term_frequency=True, consider_negation=True,
pos_tags=True)
extractor.extract(document)
Approccio 2: argomenti della funzione
def extract(document, *functions):
"""Extract features from a document."""
features = []
for function in functions:
features.extend(function(document))
return features
def extract_term_frequency(document):
pass
def extract_negation(document):
pass
def extract_pos_tags(document):
pass
extract(document, extract_term_frequency, extract_negation, extract_pos_tags)
Approccio 3: classe con mixin o eredità multipla
Qualcosa di una combinazione del primo e del secondo approccio, anche se non sono sicuro di come sarebbe stato fatto.
Qualche idea su una direzione da affrontare sarebbe molto apprezzata!