9

Molte funzioni sono facili da nominare. Generalmente, il nome di una funzione si basa su ciò che fa o sul tipo di risultato che produce.Nome funzione generatore Python - è un prefisso utile?

Nel caso di una funzione di generatore, tuttavia, il risultato potrebbe essere iterabile su un altro tipo.

def sometype(iterable): 
    for x in iterable: 
     yield some_transformation(x) 

Il nome sometype sente fuorviante, dal momento che la funzione non restituisce un oggetto del tipo di nome. È davvero un iterable su sometype.

Un nome come iter_sometype o gen_sometype si sente un po 'troppo come Hungarian Notation. Tuttavia, sembra anche chiarire l'intento della funzione.

Proseguendo ulteriormente, ci sono un numero di casi più specializzati, in cui un prefisso potrebbe essere utile. Questi sono esempi tipici, alcuni dei quali sono disponibili in itertools. Tuttavia, spesso dobbiamo scrivere una versione che ha una certa complessità algoritmica che lo rende simile a itertools, ma non perfetto.

def reduce_sometype(iterable): 
    summary = sometype() 
    for x in iterable: 
     if some_rule(x): 
      yield summary 
      summary= sometype() 
     summary.update(x) 

def map_sometype(iterable): 
    for x in iterable: 
     yield some_complex_mapping(x) 

def filter_sometype(iterable): 
    for x in iterable: 
     if some_complex_rule(x): 
       yield x 

Condivide la iter_, map_, reduce_, filter_ prefisso aiutare a chiarire il nome di una funzione di generatore? O è solo un disordine visivo?

Se un prefisso è utile, quali suggerimenti del prefisso avete?

In alternativa, se un suffisso è utile, quali sono i suggerimenti del suffisso?

+0

Penso che tu sia un po 'troppo generalizzato .. Voglio dire, la maggior parte scriverebbe semplicemente le tue 2a e 3a funzione direttamente come espressioni del generatore ala '(some_mapping (x) per x in iterable)'. Il primo non "riduce" nulla, è più simile a una mappatura dato che c'è un nuovo 'sometype' per ogni' x'. –

+1

@ THC4k: immagina che siano più complessi.Troppo complesso per adattarsi facilmente all '"itertools". Non così complesso da violare i principi di programmazione funzionale di base. Ad esempio, potrebbero comportare un sacco di lavoro di installazione preliminare come ottimizzazione. –

risposta

6

Python dicts hanno metodi iter*. E gli alberi lxml hanno anche un metodo iter. lettura

for node in doc.iter(): 

sembra familiare, in modo successivo modello, mi piacerebbe prendere in considerazione la denominazione un generatore di sometypes sometypes_iter modo che io possa scrivere analgously,

for item in sometypes_iter(): 

Python fornisce una funzione sorted. A seguito di quel modello, potrei fare il verbo-funzioni passato:

sometypes_reduced 
sometypes_mapped 
sometypes_filtered 

Se avete abbastanza di queste funzioni, potrebbe avere senso per fare una classe SomeTypes in modo che i nomi dei metodi potrebbero essere ridotti a reduce, map e filter.

Se le funzioni possono essere generalizzati per accettare o restituire tipi diversi sometype, poi, naturalmente, avrebbe senso per rimuovere sometype dal nome della funzione, e invece scegliere un nome che sottolinea ciò che fa, piuttosto che i tipi.

Problemi correlati