Un po' di commenti sparsi: - evita "import *", sopratutto se poi fai riferimento comunque al modulo threading - è inutile sottoclassare Thread, usa piuttosto il suo costruttore e il parametro "target" - se proprio vuoi che scanports sia una classe, ,è convenzione che le classi siano in CamelCase - scanports è un nome fuorviante: non lavora su diverse porte al plurale, ma solo su una - non c'è bisogno del parametro ports - non c'è neanche bisogno del parametro servs: puoi passare il nome del servizio già a scanport - per farlo, evita .index(), che è brutto ed error prone, zip() è tuo amico - definisci le tue strutture dati in un posto diverso da dove c'è la business logic - usa un dizionario "porta" -> 'nome servizio comunemente li esposto" e un dizionario "modalità di scansione"-> "lista/set di porte" (così probabilmente non andresti più ad usare zip(), ma avrai altre opportunità per farlo) - non mischiare la business logic con la presentazione (per quanto possibile, in uno scriptino piccolo come questo immagino magari puoi rilassare le best practices) - non assumere che gli utenti abbiano il tuo stesso setup e non aspettarti che spendano troppo a tempo a configurare il tuo programma, dei default sani di mente sono importanti - in merito a quanto sopra: piuttosto che dire di modificare il codice in base al numero di thread, usa os.cpu_count() (o multiprocessing.cpu_count() se sei su un vecchio python) - ancora: usa shutil.get_terminal_size().columns invece di tirare ad indovinare il numero di colonne - fattorizza, fattorizza, fattorizza - un esempio sono tutte le ripetizioni di write();flush()... quella sarebbe una delle prime cose da mettere in una funzione - se non esistesse già una funzione che fa quello che cerchi: print(foo, end='', flush=True) - evita di riempire di spazi una linea, se andrai comunque a sovrascriverla, usa ljust: print(('\rfoobar').ljust(columns), end='', flush=True) - questo è un obbrobrio: str(abcd[0])+'.'+str(abcd[1])+'.'+str(abcd[2])+'.'+str(abcd[3]) - abcd è un pessimo nome di variabile - alternative migliori: ".".join(map(str, ip)) o "%s.%s.%s.%s" % tuple(ip) o "{}.{}.{}.{}".format(*ip) - ovviamente, anche in questo caso non serve, visto che Python ci fornisce qualcosa nella stdlib: https://docs.python.org/3/library/ipaddress.html - invece di fare magheggi con le 4 parti dell'indirizzo, potresti tranquillamente incrementare l'indirizzo: ip = ip_address('127.0.0.1'); ip += 1 - effettivamente, non capisco perchè richiedi un indirizzo, se questo non viene usato per considerare la rete sulla quale si sta lavorando (e la sua dimensione), meglio `for ip in ip_network('0.0.0.0/0').hosts()` - `raise KeyboardInterrupt` è un abuso delle eccezioni usato così, imho... un `break` dovrebbe bastarti in questo caso - except: pass è un NONONONO - non capisco esattamente il significato di gotit (usi delle stringhe invece di un booleano e mi sembra che ci sia un errore logico che possa causare uno skip degli indirizzi ip), ma stai usando una variabile globale per quello che sembra un lavoro di sincronizzazione. Guardati lock, semafori e quant'altro - installa ed usa flake8
Capisco che non tutti siano di madrelingua italiana, ma certe discussioni qui a volte sono un po' disorientanti 2014-09-13 11:56 GMT+02:00 Remo The Last <py.remothel...@yahoo.it>: > ecco uno scannerino a comando linea, full connect, altamente funzionante. "a linea di comando" full connect vuol dire tutto e niente, "altamente funzionante" sembra un po' una presa in giro: a casa mia le cose funzionano, o NON funzionano. Casomai è pieno di feature, performante, efficiente, user-friendly, etc. 2014-09-13 21:42 GMT+02:00 Remo The Last <py.remothel...@yahoo.it>: > E' uno scanner che non deve esser sicuro. Deve fare il suo dovere di > scanner. Nessuno ha detto niente sulla sicurezza di questo script _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python