Python Generator nomi di funzione - è un prefisso utile? [chiuso]
-
26-09-2019 - |
Domanda
La maggior parte delle funzioni sono facili da nome. Generalmente, un nome di funzione si basa su ciò che fa o il tipo di risultato che produce.
Nel caso di una funzione generatore, tuttavia, il risultato potrebbe essere un iterabile su qualche 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. E 'davvero un sometype
sopra iterabile.
Un nome come iter_sometype
o gen_sometype
si sente un po 'troppo come ungherese Notazione . Tuttavia, sembra anche a chiarire l'intento della funzione.
Andando oltre, ci sono un certo 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 siamo costretti a scrivere una versione che ha ottenuto una certa complessità algoritmica che lo rende
simile a itertools
, ma non una perfetta vestibilità.
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
Il il iter_
, map_
, reduce_
, filter_
aiuto prefisso chiarire il nome di una funzione generatore? O è solo l'ingombro visivo?
Se un prefisso è utile, quale prefisso suggerimenti avete?
In alternativa, se un suffisso è utile, ciò che suffisso suggerimenti avete?
Soluzione
Python dicts
hanno metodi iter*
. E gli alberi lxml hanno anche un metodo iter
.
Lettura
for node in doc.iter():
sembra familiare, in modo da
successivo modello, mi piacerebbe prendere in considerazione la denominazione un generatore di sometypes sometypes_iter
in modo che ho potuto 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 ad accettare o tipi restituiti 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.