[Python] saluti e prima domanda sulle list comprhension

Enrico Franchi enrico.franchi a gmail.com
Dom 27 Gen 2008 23:47:38 CET


On Jan 27, 2008, at 6:22 PM, Java wrote:

> No, il proff vuol poter lanciare più processi crawler in parallelo e  
> poi
> vuole che si analizzino i risultati finali.

1. fare le cose in parallelo non implica farle con i thread
2. oltre al modello a processi, c'è pure il modello asincrono. Il  
quale probabilmente è quello che garantirebbe la migliore efficienza,  
per inciso.

BTW: delle tre cose, la peggiore è quella di usare i thread.

> Poi io ho pensato di realizzare la cosa con un programma principale  
> che
> esegue un ciclo nel quale accetta dei comandi dall'utente. Se il  
> comando
> è "crawler" allora aprte il thread. Poi conterrà anche i comandi per
> generare la rete sociale dai risultati del crawling (salvati su  
> file) e
> per altre operazioni

Risconsiglio i thread.

> L'input arriva da "fuori" è un parametro del costruttore del thread, e
> anche i vari print mi servono solo per debug, poi li levo tutti e  
> metto
> il try-except

Quindi mi pare un errore logico comunque. Prendi 'da fuori' una  
stringa che rappresenta un'intero e la converti 'ad un certo punto'.
La cosa corretta è passare al costruttore il valore giusto. O  
eventualmente fare smazzare la cosa al costruttore. O se ti piace  
menartela con i design pattern, vai con l'Adapter (ecco, tipo a me  
pare una di quelle cose roboanti introdurre una classe apposta per una  
cosa del genere, specie in Python, ma almeno ci sono le  
zope.interfaces, va).

> me ne ero accorto :-(
> Chissà perché ero convinto che così facendo avrei copiato i valori dda
> una lista all'altra invece di farle puntare tutte allo stesso oggetto.
> In effetti non è un errore di python, ma di programmazione in  
> generale (>_>)

Au contraire!  È un errore di Python (ma anche di Java, volendo). In C+ 
+ per esempio in caso di assegnamento c'è tipicamente la copia (a meno  
che non siano definite cose strane -- e con comunque il 'problema' è  
una shallow copy).

In Python l'assegnamento tipicamente non duplica un valore. Le  
variabili sono sempre e solo riferimenti ad oggetti. Per copiare un  
oggetto, usi un metodo che ne crei uno nuovo e ritorni quello.  
Ovviamente la cosa è rilevante solo con gli oggetti mutabili. Le  
stringhe sono immutabili: concatenare stringhe con il + è inefficiente  
precisamente per questa ragione (ogni somma crea una nuova stringa, n  
somme, creano n stringhe).

> il for è la prima cosa a cui penso (dopo anni di c, c++, java etc etc)
> ma mi "forzo" ad usare le list comprecose per impararle bene

In primo luogo il for di Python è *diverso* da quello di C++. Ma a  
parte questo usare le list comprehensions a sproposito non è un buon    
modo per impararle. Posto che quello che hai scritto è sintatticamente  
corretto, chiunque leggesse quel codice si chiederebbe se sei  
consapevole che extend modifica in place e che cosa vuoi fare con una  
lista di None.

L'idea della list comprehension è questa: costruisci una lista di f(x)  
con gli x provenienti da un iterabile (se vale una certa condizione su  
x).

In pratica nella list comprehension il return value è pragmaticamente  
importante.

> Naaaa i "fondamentali" sono tutti i linguaggi che già conosco :-p

Mah. Ribadisco, un'occhiatina alla semantica di Python la darei, tanto  
per evitare altre cattive sorprese.



More information about the Python mailing list