Come gestire i parametri singolari e plurali per le funzioni

5

Spesso quando scrivo un insieme di funzioni di utilità, mi ritrovo a volere una funzione che applica una logica a più elementi, oltre a una funzione che fa lo stesso con un singolo elemento. Ci sono molte potenziali soluzioni a questo, ma mi trovo sempre a capovolgere avanti e indietro.

  • Potrei scrivere una versione esclusivamente singolare della funzione ( modify_item(item) ) e usare map , comprensione o foreach esternamente. Però non voglio farlo ogni volta che lo chiamo con più elementi.
  • Potrei scrivere una versione esclusivamente esplicitamente plurale della funzione ( modify_items(items) ) che esegue l'iterazione all'interno. Ma non voglio nemmeno chiamarlo con una lista ogni volta. Meglio che sempre singolare, ma ancora difficile da chiamare. Ciò supporterà anche le operazioni di massa.
  • Potrei scrivere una funzione agnostica che controlla il tipo di input ( modify_item(item) ). Se non è iterabile, lo inserirà in un elenco e quindi itererà. Questa sembra essere l'opzione migliore, ma il richiamo degli operatori di stelle mi fa sempre ...
  • Potrei scrivere una funzione agnostica che prende un numero variabile di input (modify_item (* items)) e itera su di essi. Questo mi dà una buona sintassi di chiamata e impacchetta automaticamente gli elementi in un iterabile per me. Il problema che mi imbatto sempre qui è che aggiungere argomenti successivi o argomenti di parole chiave è scomodo.
  • Infine, potrei semplicemente alzare le mani e scrivere una funzione plurale come sopra, e una singolare che avvolgerebbe il parametro in una lista e lo passerebbe al plurale. Quindi dovrei scrivere il doppio delle funzioni, il che è sciocco.

Sembra che le librerie javascript di solito facciano l'opzione di controllo del tipo (n. 3), ed è quella che mi piace di più. In tal caso, hai la domanda di denominare le convenzioni. Penso di preferire il singolare, ma non ne sono sicuro.

Gli esempi sono in python, ma questa domanda potrebbe essere applicata alla maggior parte delle lingue.

    
posta JStaab 08.09.2015 - 18:44
fonte

2 risposte

0

Un mio amico mi ha convinto dell'opzione numero tre, con l'aggiunta che usa una funzione di supporto chiamata ensure_plural per garantire che l'input sia plurale prima di continuare. Questo lo mantiene carino e dichiarativo. La funzione di supporto potrebbe assumere forme diverse:

  • Come decoratore, modificherebbe solo gli input prima di arrivare alla funzione principale. Il problema è che dovrebbe assumere alcune cose.
  • Potrebbe essere chiamato solo sul valore che deve essere plurale quando necessario.
  • Ho anche creato una versione chiamata if_plural , che accetta un valore e una funzione e restituisce il risultato dell'applicazione della funzione direttamente al valore se singolare, o di mappare la funzione sul valore se plurale .
risposta data 10.09.2015 - 00:14
fonte
7

In questi casi, di solito creo due versioni della funzione, con la versione multipla che chiama semplicemente la versione singolare, qualcosa del genere:

class Foo:
  def transform_entity(bar):
    return do_things(bar)

  def transform_entities(bars):
    return [transform_entity(b) for b in bars]

È piuttosto auto-esplicativo, evita qualsiasi involucro esplicito e ti permette di usare gli argomenti correttamente senza il wrapping manuale (a differenza di provare a fare qualcosa di terribile con vararg).

    
risposta data 09.09.2015 - 02:46
fonte

Leggi altre domande sui tag