[Python] dubbi random

Daniele Varrazzo piro a develer.com
Lun 2 Mar 2009 17:30:04 CET


On Mon, 02 Mar 2009 12:10:41 +0100, Matteo Bertini <matteo a naufraghi.net>
wrote:

> però il fatto che il kwarg non vada bene mi suona strano.

Credo sia una sorta di "difetto di implmentazione", o mancanza di tale.
strptime è un builtin scritto in C, e nell'api C ci sono diverse funzioni
di parsing degli argomenti (vedi http://docs.python.org/c-api/arg.html):
probabilmente (non ho i sorgenti sottomano) strptime ne usa una molto
specifica (es. PyArg_ParseTuple), mentre in una funzione python
probabilmente l'interprete usa sempre la più generica di tutte.

Se strptime fosse scritta in python potresti probabilmente usare le
keywords, ma il nome del parametro farebbe formalmente parte
dell'interfaccia della funzione.

>>> Per analogia:
>>> le liste non hanno chiamate nop
>> [].extend([]) e` una nop
> E' vero... anche se è una nop per definizione, indipendentemente dallo 
> stato della lista.

Intendi chiamate "idempotenti" ('gnurant... :D). list.clear() è
idempotente... anche se questo non la rende analoga a set.add() :)

>>> il set è un po' una via di mezzo...
>> Il set() e` un insieme, che supporta operazioni insiemistiche.
>> L'aggiunta di un elemento esistente non altera lo stato
>> del set. Se proprio ci tieni puoi controllare len(s) prima e dopo
>> l'inserimento, per vedere se la sua dimensione e` cambiata.
>> Oppure usare l'in come hai fatto tu per sapere se c'e` o meno.
> Ci sono casi in cui un return con un senso evita di fare 2 volte la 
> stessa domanda ad una struttura dati.

A me quello che dici capita abbastanza spesso anche con i dizionari:
controllare se una chiave esiste e, in caso negativo aggiungerla. Sarebbe
stato comodo avere un bool di ritorno che indica "ho inserito davvero" o
"già c'era". Ma coi dict cosa restituire? "la chiave già c'era" o "la
chiave c'era e il vecchio valore è uguale al nuovo"? In quest'ultimo caso
però sarebbe stato necessario anche un check di uguaglianza, che non è
richiesto ad un oggetto per essere valore di dizionario. E quindi il bool
avrebbe aiutato a sostituire i casi in cui fai "if k not in d: d[k] = v",
ma non i casi in cui fai "if d.get(k) != v: d[k] = v"... insomma un aiuto a
metà. Un altro possibile valore di ritorno "sensato" sarebbe potuto essere
il precedente valore (o None se non c'era. Ma se c'era ed era proprio
None?). Probabilmente per evitare ogni ambiguità si è pensato di tagliare
la testa al toPo e non restituire niente.

> Ammetto che il senso del return può essere difficile da trovare per 
> oggetti complessi, ma per oggetti semplici forse esiste una unica 
> risposta sensata.
> 
> Nel caso del set la mia domanda era:
> non è il cambio di stato l'unica risposta sensata che può dare set.add?

Il set non sarebbe stato ambiguo come il dict, ma forse si è preferito
mantenere il parallelismo per ragioni di consistenza tra i contenitori
(nessun contenitore restituisce alcunché in aggiunta). Credo che in
qualche algoritmo sia utile avere la nuova lunghezza invece di un flag che
indichi "inserito o no".

-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python