[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