View Full Version : python vs java
Buon giorno a tutti sono uno studente di ingegneria informatica prossimo alla laurea di primo livello.Al fine di conseguire tale laurea devo svolgere una monogroafa ("tesi"). per tale monografia mi sono rivolto al professore di programmazione a oggetti. tale corso è imporontato sul linguaggio java e siccome tale professore intende spostare negli anni futuri il corso dal linguaggio java al linguaggio python mi ha assegnato di svolgere la mia monografia sulle differenze (e similitudini) tra i due linguaggi.L
La monografia deve essere composta di due parti:
-una parte introduttiva che descriva (brevemente) i linguaggi a oggetti e che si addentri nella spiegazione di differenze e similitudini tra java e python (con maggiore attenzione all'implementazione piu che a complessità e efficienza)
-una parte contenente la "traduzione" delle esercitazione del corso dal java al python.
dato che non ho mai avuto a che fare col pyton mi chiedevo fosse opportuno acquistare un manuale o affidarmi al materiale reperibile in rete e che ambiente di sviluppo mi conviene utilizzare e nel caso avessi dei problemi dove chiedere "aiuto".
mi rivolgo a questo sito perchè lo utilizzo per informazoni anche se prevalentemente riguardanti hardware sperando che sappiate darmi qualche consiglio o indicazioni su siti a cui postrei appoggiarmi.
Ringrazio tutti per la disponibilità
cdimauro
23-07-2011, 17:28
Per un'introduzione veloce a Python, visto che non sei un novellino: Learn Python in 10 minutes (http://www.korokithakis.net/tutorials/python/).
Per l'obiettivo che ti poni: Python for Java Programmers (http://python.computersci.org/Main/TableOfContents).
Non penso che ti serva altro. Eventualmente puoi dare un'occhiata al libro che ho in firma, ma penso che servirà più che altro al tuo professore se vuole introdurre alla programmazione degli studenti usando Python.
In ogni caso in questo forum troverai sicuramente qualcuno disposto ad aiutarti nel caso in cui avessi bisogno.
Per un'introduzione veloce a Python, visto che non sei un novellino: Learn Python in 10 minutes (http://www.korokithakis.net/tutorials/python/).
Per l'obiettivo che ti poni: Python for Java Programmers (http://python.computersci.org/Main/TableOfContents).
Non penso che ti serva altro. Eventualmente puoi dare un'occhiata al libro che ho in firma, ma penso che servirà più che altro al tuo professore se vuole introdurre alla programmazione degli studenti usando Python.
In ogni caso in questo forum troverai sicuramente qualcuno disposto ad aiutarti nel caso in cui avessi bisogno.
ti ringrazio per al prontezza nella risposta...colgo l'occasione per chiederti se sai dove posso trovare una breve analisi comparativa sulle prestazioni dei due linguaggi e se hai qualche consiglio sull'ambiente di sviluppo perchè cercando su internet ho trovato che praticametne il 90% dei compilatori è in grado di gestire python con appisti plug-in e quinid non saprei quale utilizzaire (non ho preferenze sll'utilizzo di sistemi operativi unix o windows avendoli a disposizione entrambi).
durante il mio "corso di java" si è utilizzato eclipse puo andar bene o conviene usarne un altro?
cdimauro
23-07-2011, 21:40
ti ringrazio per al prontezza nella risposta...
Più che altro sei stato fortunato che mi son trovato a dare un'occhiata veloce al forum. :p
colgo l'occasione per chiederti se sai dove posso trovare una breve analisi comparativa sulle prestazioni dei due linguaggi
Di Python esistono diverse implementazioni. La mainstream si chiama CPython, che non è dotata di compilatore JIT a runtime, per cui un confronto con la JVM standard è a dir poco impietoso.
PyPy è un progetto più recente che sta riscuotendo un notevole successo e che probabilmente è destinato a diventare la futura versione mainstream. Implementa un compilatore JIT x86 (quello ARM è quasi pronto) e presenta delle buone prestazioni (http://speed.pypy.org/).
e se hai qualche consiglio sull'ambiente di sviluppo perchè cercando su internet ho trovato che praticametne il 90% dei compilatori è in grado di gestire python con appisti plug-in e quinid non saprei quale utilizzaire (non ho preferenze sll'utilizzo di sistemi operativi unix o windows avendoli a disposizione entrambi).
Uso NetBeans 6.9.1 con l'apposito plug-in per Python, ma ho sentito parlare molto bene di WingIDE e, di recente, di PyCharm, ma questi ultimi sono a pagamento purtroppo.
durante il mio "corso di java" si è utilizzato eclipse puo andar bene o conviene usarne un altro?
Guarda, Eclipse ha degli ottimi plug-in per qualsiasi cosa, ma come IDE lo trovo veramente malfatto.
Poi, alla fine, è sempre una questione di gusti, eh! :stordita:
quoto cesare su tutta la linea, in più ti segnalo: http://pythonconquerstheuniverse.wordpress.com/category/java-and-python/
Per quanto riguarda l'IDE: per Java ho sempre utilizzato netbeans con somma soddisfazione ma devo dire che, dal mio punto di vista, ho trovato il plugin per python ancora (purtroppo) troppo acerbo. Al contrario invece Eclipse+pyDev va una favola ma oggettivamente eclipse fa abbastanza pena.
L'IDE python di elezione per me è pycharm, ma, come detto, è a pagamento.
@cdimauro: quando dici "La mainstream si chiama CPython, che non è dotata di compilatore JIT a runtime, per cui un confronto con la JVM standard è a dir poco impietoso." intendi che la JVM ha prestazioni superiore a CPython ?
ringrazio entrambi per le rispsote quanto prima provvederò a "rinfrescare" le mie conoscenze (piu che altro quelle teoriche) di java e inizierò a leggere il materiale da voi indicatomi iniziando a buttare giu qualche riga di confronto su cui (spero) avrete voglia di discutere in modo da poter fornire un lavoro piu accurato e preciso.
cdimauro
24-07-2011, 07:44
quoto cesare su tutta la linea, in più ti segnalo: http://pythonconquerstheuniverse.wordpress.com/category/java-and-python/
Questo l'avevo visto qualche tempo fa, ma non sapevo come recuperarlo. Grazie. :)
Per quanto riguarda l'IDE: per Java ho sempre utilizzato netbeans con somma soddisfazione ma devo dire che, dal mio punto di vista, ho trovato il plugin per python ancora (purtroppo) troppo acerbo. Al contrario invece Eclipse+pyDev va una favola ma oggettivamente eclipse fa abbastanza pena.
Infatti. PyDev è ottimo, anche se in versione base (perché altre funzionalità le offre a pagamento), ma purtroppo è Eclipse che fa schifo, e una volta assaggiato NetBeans, pur con tutti i suoi limiti, l'ho abbandonato.
L'IDE python di elezione per me è pycharm, ma, come detto, è a pagamento.
In tutta onestà non l'ho mai provato. Come non ho provato WingIDE, proprio perché sono a pagamento.
Non vorrei assaggiare la Nutella e poi avere l'ossessione di volerla mangiare sempre.
@cdimauro: quando dici "La mainstream si chiama CPython, che non è dotata di compilatore JIT a runtime, per cui un confronto con la JVM standard è a dir poco impietoso." intendi che la JVM ha prestazioni superiore a CPython ?
Sì, decisamente. Posto qualche benchmark (http://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.php) che, comunque, va preso con le pinze per diversi motivi.
ringrazio entrambi per le rispsote quanto prima provvederò a "rinfrescare" le mie conoscenze (piu che altro quelle teoriche) di java e inizierò a leggere il materiale da voi indicatomi iniziando a buttare giu qualche riga di confronto su cui (spero) avrete voglia di discutere in modo da poter fornire un lavoro piu accurato e preciso.
Non ti preoccupare. Python ha preso abbastanza piede in questo forum, e qualcuno che ti possa dare una mano bene o male lo troverai sempre, come dicevo prima. ;)
in seguito a una breve descrizione della programmazione orientata agli oggetti volevo inserire una "breve" analisi comparativa delle caratteristiche "pratiche" dei due linguaggi (ad esempio java è tipizzato python no).Le caratteristiche di python sono facilmente deducibili dal tutorial (Learn Python in 10 minutes) che mi avete linkato sopra ma quelle del java non le trovo conoscete mica un totorial simile ma relativo a java?
banryu79
27-07-2011, 12:12
...(ad esempio java è tipizzato python no).
Credo che la parola "tipizzato" in italiano non esista, volevi forse dire "tipato"?
Ad ogni modo Java rientra nella categoria dei linguaggi staticamente tipati (statically typed languages), mentre Python in quella dei linguaggi dinamicamente tipati (dinamically typed languages).
In una vecchia intervista su aritma ho letto che Guido Van Rossum (il papà di Python) parlava della sua creatura in termini di "runtime typed language".
Entrambi poi fanno parte della categoria dei linguaggi "fortemente tipati" (strongly typed vs weakly typed). Un abbozzo sulle principali differenze tra queste categorie (static vs dinamyc e strong vs weak) lo trovi in uno dei link precedenti. Poi se vuoi leggere qualcosa di più puoi provare a dare un'occhiata su wikipedia alla voce "Type System" e da li cercare altre letture.
Credo che la parola "tipizzato" in italiano non esista, volevi forse dire "tipato"?
mi risulta siano sinonimi... confrontandomi con un mio compagno di corso mi è parso piu adatto inserire un superficiale analisi dei due linguaggi e poi addentrarmi nella realizzazione di codice (ad esempio gestione liste\mappe) confrontando i due linguaggi "argomento" per "argomento".
Al momento sto svolgendo quella di java evidenziando caratteristiche (sia positive che negative) come:
Java è un linguaggio di programmazione orientato agli oggetti, creato da James Gosling e altri ingegneri di Sun Microsistem. Java è un marchio registrato di Oracle.
Le principali caratteristiche del linguaggio Java sono:
1. sintassi;
2. gestione delle eccezzioni e memoria efficiente
3. indipendenza della piattaforma
4. orientato agli oggetti
5. sicurezza
6. risorse per l’esecuzione
2.1 Sintassi
La sintassi del Java è molto simile a quella del C e del C++ (con ovvie differenze) e quindi, per un programmatore, non è molto traumatico il passaggio dai linguaggi sopracitati al Java.
2.2 Gestione di eccezioni e memoria
Il Java ha un sistema di gestione delle eccezioni molto efficiente e anche un sistema di deallocazione della memoria molto funzionale utilizzando il Garbage Collector e sollevando così il programmatore alla deallocazione manuale della memoria allocata precedentemente. La gestione della memoria molto efficiente conferisce al Java un requisito di robustezza molto elevato.
2.3 indipendenza della piattaforma
Questo è uno dei punti di forza principali del Java. Infatti con questo linguaggio, una volta compilato il codice sorgente - utilizzando la Java Virtual Machine l'applicativo potrà essere eseguito su macchine aventi sistema Windows, Machintosh o Linux. La JMV è un software che compie, principalmente, un lavoro di interprete del codice compilato. Una volta compilato il linguaggio non avremo un file in linguaggio macchina che può essere eseguito immediatamente, ma bensì avremo un listato in bytecode. Il bytecode ottenuto è indipendente dalla piattaforma di compilazione e l'indipendenza della piattaforma è ottenuta grazie alla JMV che traduce il bytecode nel linguaggio macchina relativo per la piattaforma di esecuzione. Inoltre la JVM conferisce al Java la caratteristica di essere multithreading ovvero avere la possibilità di mandare in esecuzioni più processi in maniera parallela.
2.4 Orientato agli oggetti
Il Java è un linguaggio puramente orientato agli oggetti. La scrittura di linguaggio orientato agli oggetti in Java, è più semplice rispetto agli altri linguaggio orientati agli oggetti come per esempio C++. Come detto prima, il Garbage Collector si preoccupa della gestione della memoria e quindi in Java non è presente l'aritmetica dei puntatori come in C o C++. Questo conferisce al linguaggio Java una facilità di apprendimento molto elevato in quanto la gestione dei puntatori e l'allocazione della memoria è considerato il punto debole, dal punto di vista della rapidità di apprendimento, dei linguaggi che consentono queste operazioni.
2.5 Sicurezza
Altro punto di forza del linguaggio Java è la sicurezza nell'esecuzione delle aplicazioni. Prima di tutto con il Java, dato che la gestione della memoria non viene gestita dall'utente, non ci sarà più il pericolo di andare a scrivere in celle di memoria sbagliate magari sovrascrivendo dati importanti. Si ha dunque che il lancio di un'applicazione scritta in Java viene completamente gestita dalla JVM e quindi molti problemi di overflow dei dati ed errori nella gestione della memoria sono scongiurati.
2.6 Risorse per l’esecuzione
Questo è uno dei punti di debolezza più evidenti del Java. La mancanza dell'aritmetica dei puntatori rende il Java molto più avido per quanto riguarda la richiesta delle risorse necessarie per l'esecuzione. Questo perchè se in un'applicazione viene instanziato un array, una volta terminate le operazioni da eseguire sull'array sarebbe molto più efficiente poter deallocarlo in maniera manuale, rilasciando la memoria invece di far compiere questa operazione al Garbage Collector alla fine dell'applicazione. Dunque se dobbiamo sviluppare applicazioni per sistemi con memoria limitata come potrebbe essere un sistema embedded come una telecamera che supporta l'installazione di applicazioni, non è assolutamente consigliabile l'utilizzo del Java.
In questi ambienti è molto più indicato utilizzare linguaggi come il C e il C++ che, anche se di più difficile apprendimento, garantisticono una gestione della memoria manuale per poter sfruttare al meglio le risorse limitate del sistema.
mi scuso per come vi sottopongo il testo ma sono in università e non mi è possibile da qui caricare il file di testo da nessuna parte( è tutto bloccato)
questo è quello che ho "recuperato" dalle slide del mio corso e dalla rete ma volevo sapere se
cdimauro
27-07-2011, 14:16
In questo momento ho poco tempo. Appena posso mi smazzo quello che ho scritto. Per il resto concordo con banryu.
devo "consegnare" la monografia ai primi di settembre quindi ho tutto il tempo (volendo anche per farla 2 volte XD) penso che la parte piu costosa (in termini di tempo)sia la traduzione delle esercitazioni dal java al python ma vorrei fare un bel lavoro in modo da poterlo poi sfruttare come partenza per la tesi della laurea specialistica. oggi pomeriggio mi leggo un po di recensioni e analisi di python e vedo di elaborarne qualche cosa in modo da terminare la parte introduttiva e chiedere il vostro parere sull'insieme :)
grazie ancora della disponibilità
banryu79
27-07-2011, 16:38
Premessa Fondamentale:
Non ho una preparazione rigorosa alle spalle, quindi osservazioni e correzioni a quanto segue sono le benvenute.
JcBobo, prendi cum grano salis le osservazioni che seguono.
Java è un linguaggio di programmazione orientato agli oggetti...
So che siamo spesso sottoposti a definizioni di questo tipo, ma la questione è diversa, nel senso che ad essere o non essere orientato agli oggetti non è il linguaggio (di programmazione) ma il paradigma di programmazione. Del linguaggio poi si potrà dire che supporta o non supporta un certo paradigma di programmazione (e spesso non è una questione del tipo sì/no, ma è una questione di grado).
Fatta questa premessa, possiamo prendere Java e Python e metterli a confronto andando a vedere quali paradigmi di programmazione ognuno dei due linguaggi supporta; nel caso in cui un eventuale paradigma sia supportato da entrambi i linguaggi possiamo andare a vedere come un linguaggio lo supporti rispetto all'altro.
Ad esempio: Python supporta il paradigma funzionale, mentre Java no.
Altro esempio: il paradigma orientato agli oggetti è supportato sia in Java che in Python, ma non nello stesso modo.
2.4 Orientato agli oggetti
Il Java è un linguaggio puramente orientato agli oggetti. La scrittura di linguaggio orientato agli oggetti in Java, è più semplice rispetto agli altri linguaggio orientati agli oggetti come per esempio C++. Come detto prima, il Garbage Collector si preoccupa della gestione della memoria e quindi in Java non è presente l'aritmetica dei puntatori come in C o C++. Questo conferisce al linguaggio Java una facilità di apprendimento molto elevato in quanto la gestione dei puntatori e l'allocazione della memoria è considerato il punto debole, dal punto di vista della rapidità di apprendimento, dei linguaggi che consentono queste operazioni.
Non è affatto vero che Java è un linguaggio *puramente* orientato agli oggetti.
Il linguaggio fornisce alcuni strumenti (costrutti, tipi primitivi) che non c'entrano con il paradigma OO.
E' il paradigma di programmazione ad essere OO; il linguaggio offre un supporto a tale paradigma più o meno solido.
Ci sarebbero altre cose da rivedere con calma, perchè ho l'impressione che tu abbia "mescolato" alcuni concetti facendo un po' di confusione, per non parlare di alcune affermazioni decisamente false.
Ad esempio quando citi la presenza di un garbage collector per la memoria nel paragrafo titolato "2.4 Orientato agli oggetti" (la gestione automatica della memoria non c'entra niente con l'orientamento agli oggetti), oppure quando dici che non potendo deallocare manualmente la memoria, un array allocato in Java verrà deallocato dal g.c. solo al termine dell'applicazione (è falso) e che questo determinerebbe un uso inefficiente delle risore (questo è decisamente contestabile quando ancora non falso).
quindi se ho ben capito dove ho scritto che java è un linguaggio a oggetti dovrei mettere che java è un linguaggio che supporta il paradigma della programmazione a oggetti (oltre altri paradigmi).
il corso che ho seguito si è occupato esclusivamente del java "applicato" alla programmazione a oggetti (infatti il nome del corso è "programmazione a oggetti") assolutamente ignorando questo aspetto.
Altro esempio: il paradigma orientato agli oggetti è supportato sia in Java che in Python, ma non nello stesso modo.
questa differenza dovrei espanderla ma non avendo ancora iniziato a programmare in python non ne sono in grado al momento.
Ci sarebbero altre cose da rivedere con calma, perchè ho l'impressione che tu abbia "mescolato" alcuni concetti facendo un po' di confusione, per non parlare di alcune affermazioni decisamente false. se hai tempo (e voglia) potresti elencarmele\ spiegarmele?
le informazioni che ho unito al fine di svolgere quell'analisi le ho reperite in rete o da miei vecchi appunti, quindi non è detto che siano esatte (anzi)
ho riguardato il tutto e corretto alcune cose(nel file ho lasciato i titoli dei paragrafi che intendo inserire nella monografia)
ultima versione del mio "lavoro" e aggiunta la parte introduttiva a python http://www.megaupload.com/?d=XUN9H37L
starfred
30-07-2011, 11:11
Secondo me una parte interessante sarebbe il confronto dei rispettivi bytecode e virtual machine.
Per esempio un progetto (a mio parere interessante) è Jython.
Un'altra parte interessante può essere il raffronto sulla parte di programmazione concorrente e distribuita e la gestione dinamica della memoria.
Ma già credo che sul primo punto ci sarebbe da scriverci più di un libro :D
ciao
Secondo me è perfettamente lecito parlare di Java come linguaggio "orientato agli oggetti", proprio perché "orientato" significa che è pensato per quel tipo di paradigma.
D'altronde è evidente che quello è il paradigma predominante in Java (basta vedere anche come sono strutturate le API che mette a disposizione).
cdimauro
30-07-2011, 18:32
ho riguardato il tutto e corretto alcune cose(nel file ho lasciato i titoli dei paragrafi che intendo inserire nella monografia)
ultima versione del mio "lavoro" e aggiunta la parte introduttiva a python http://www.megaupload.com/?d=XUN9H37L
Finalmente ho trovato il tempo di leggere il tuo documento. Ritieniti fortunato perché purtroppo, causa famiglia e parecchi impegni, ne ho veramente poco a disposizione. :D
Di seguito le mie osservazioni:
1.1) "Definire una classe coincide essenzialmente con la definizione dei propri membri:
• attributi (dati, esattamente come i membri di un record)
• metodi (procedure che operano su un oggetto)"
Per quanto mi riguarda, definire una classe coincide con la definizione di un comportamento o, più formalmente, di un protocollo. Quindi una classe la definisco come X se e solo se è in grado di accettare i messaggi del protocollo previsto per X e rispondere "come ci si aspetta" .
Esempio classico (in Python): una classe può comportarsi come un file (a sola lettura) se implementa almeno il metodo read, accetta gli stessi parametri, e restituisce la risposta attesa a causa della sua invocazione. Per maggiori dettagli: http://it.wikipedia.org/wiki/Duck_typing
1.2) Quanto sopra influenza anche la definizione di oggetto.
1.2) L'information hiding si può realizzare in maniere diverse, ad esempio tramite l'uso delle proprietà (Delphi, C#, ecc.). Inoltre non è un requisito quando si parla di OOP.
1.2) In Python non si usa self per identificare esplicitamente l'istanza di una classe. Primo, self non è una parola riservata. Secondo, in Python il parametro può essere passato implicitamente (tramite il classico istanza.metodo, ad esempio), ma viene sempre referenziato esplicitamente. Il primo parametro di ogni metodo contiene sempre l'istanza su cui si lavora, e il programmatore ha l'obbligo di darle un nome, che CONVENZIONALMENTE è self, ma potrebbe essere chiamato s, this, it, ecc.. Questo per i metodi d'istanza; per i metodi di classe il discorso è analogo, salvo che il primo parametro rappresenta l'oggetto classe e in genere lo si chiama cls.
1.2) In Python il costruttore standard è il metodo speciale __init__, mentre il distruttore (o finalizzatore, per la precisione) è __del__.
1.5) "In linguaggi in cui le variabili non hanno tipo"
In Python tutte le variabili hanno un ben preciso tipo. Python è un linguaggio a forte tipizzazione.
2) "memoria efficiente"
Opinabile. Ad esempio, quanto occupa un booleano? Un bit, un byte, o una word di processore/virtual machine (32 o 64 bit)?
2) "indipendenza della piattaforma"
Non sempre. In rari casi alcune caratteristiche funzionano esclusivamente su particolari piattaforme.
2) "I programmi scritti in linguaggio Java sono destinati all'esecuzione sulla piattaforma Java, ovvero saranno lanciati su una Java Virtual Machine Ciò fornisce un livello di astrazione che permette alle applicazioni di essere interamente indipendenti dal sistema su cui esse saranno eseguite (paragrafo 2.3)"
Idem come sopra.
2.3) "Inoltre la JVM conferisce al Java la caratteristica di essere multithreading ovvero avere la possibilità di mandare in esecuzioni più processi in maniera parallela."
Attenzione al concetto di esecuzione "parallela" del codice. Ad esempio, una CPU con singolo core eseguirà tutti i processi sequenzialmente.
2.4) "La scrittura di linguaggio orientato agli oggetti in Java"
Non è chiaro. Vorresti dire "La scrittura di codice in un linguaggio orientato agli oggetti come Java"?
2.4) "La scrittura di linguaggio orientato agli oggetti in Java, è più semplice rispetto agli altri linguaggio orientati agli oggetti come per esempio C++."
Opinabile. Dipende sempre dal problema da risolvere. Ad esempio C++ consente di utilizzare classi virtuali o ereditarietà multipla che in alcuni risolvono molto più semplicemente un problema rispetto a Java o altri linguaggi.
2.6) "Questo è uno dei punti di debolezza più evidenti del Java. La mancanza dell'aritmetica dei puntatori rende il Java molto più avido per quanto riguarda la richiesta delle risorse necessarie per l'esecuzione. Dunque se dobbiamo sviluppare applicazioni per sistemi con memoria limitata come potrebbe essere un sistema embedded come una telecamera che supporta l'installazione di applicazioni, non è assolutamente consigliabile l'utilizzo del Java."
Opinabile anche questo. Spesso il maggior uso di risorse dipende dall'implementazione della virtual machine, che fa uso di compilatori JIT.
Inoltre per Java esistono delle "micro VM" che occupano pochissime risorse e vengono impiegate in sistemi embedded "poveri" di hardware (CPU scarse e poca memoria).
3.1) "Le caratteristiche più immediatamente riconoscibili di Python sono le variabili non tipizzate"
Come già detto in 1.5, tutte le varibili hanno un preciso tipo. Forse sarebbe meglio che parlassi di linguaggi a tipizzazione statica (Java) e dinamica (Python).
3.1) "Altre caratteristiche distintive sono l'overloading di operatori e funzioni"
In realtà non esiste l'overloading delle funzioni, visto che è possibile definire una sola funzione con un preciso nome, che avrà quindi soltanto una firma.
Riguardo agli operatori, per lo stesso motivo sarebbe meglio dire che è possibile ridefinirli.
3.2) "Caratteristica distintiva è il supporto nativo, oltre che ai classici tipi quali interi, floating point, stringhe, anche a tipi più evoluti quali interi a grandezza arbitraria"
A partire da Python 3 c'è un solo tipo intero, ed è precisione arbitraria.
3.2) "Molti altri tipi sono importabili da librerie standard, e nuovi tipi possono essere creati attraverso il costrutto di classe."
Grazie alla metaprogrammazione che mette a disposizione, è possibile creare nuovi tipi (tipi e classi sono la stessa cosa in Python; in ogni caso sono sempre oggetti) senza passare dal costrutto sintattico "class".
3.2.2) "Il primo elemento della coppia rappresenta l'indice, detto "chiave", mentre il secondo è il suo valore corrispondente."
La chiave dev'essere sempre un oggetto immutabile o, in generale, "hashable" (per il quale è possibile ottenere un valore hash numerico "stabile", cioè che allo stesso insieme di dati che costituisce una chiave ritorni sempre lo stesso valore di hash).
3.2.2) "Un insieme è una collezione non ordinata che non contiene elementi duplicati al suo interno."
Vale lo stesso che per le chiavi dei dizionari.
3.3) "while che cicla fin tanto che l'espressione booleana indicata risulterà vera"
Non esiste il concetto di espressione booleana in Python, ma di espressione logicamente vera o logicamente falsa.
Esempio: una stringa vuota è logicamente falsa, mentre una che ha almeno un carattere è logicamente vera.
3.3.1) "Python invece di usare parentesi o parole chiave, usa l'indentazione stessa per indicare i blocchi nidificati (si può usare sia una tabulazione, sia un numero arbitrario di spazi bianchi, ma lo standard Python è di 4 spazi bianchi). "
Mai mischiare tab e spazi in un sorgente Python, proprio perché vengono usati per definire i blocchi.
3.3.2) "Le funzioni sono considerate degli oggetti"
Qualunque cosa in Python è un oggetto: anche le classi (o tipi che dir si voglia).
3.3.5) Potresti parlare anche di PyPy, Cython, e Shedskin, che consentono, ciasciuno nei rispettivi ambiti di utilizzo, di ottenere prestazioni anche molto elevate e comparabili a volte a quelle di linguaggi come Java e C.
Finalmente ho trovato il tempo di leggere il tuo documento. Ritieniti fortunato perché purtroppo, causa famiglia e parecchi impegni, ne ho veramente poco a disposizione.
ti ringrazio molto
1.1) "Definire una classe coincide essenzialmente con la definizione dei propri membri:
• attributi (dati, esattamente come i membri di un record)
• metodi (procedure che operano su un oggetto)"
Per quanto mi riguarda, definire una classe coincide con la definizione di un comportamento o, più formalmente, di un protocollo. Quindi una classe la definisco come X se e solo se è in grado di accettare i messaggi del protocollo previsto per X e rispondere "come ci si aspetta" .
Esempio classico (in Python): una classe può comportarsi come un file (a sola lettura) se implementa almeno il metodo read, accetta gli stessi parametri, e restituisce la risposta attesa a causa della sua invocazione. Per maggiori dettagli: http://it.wikipedia.org/wiki/Duck_typing
non è implicito che definendo attributi e metodi che agiscono sulla classe io definisco il comportamento della classe ?
1.2) In Python non si usa self per identificare esplicitamente l'istanza di una classe. Primo, self non è una parola riservata. Secondo, in Python il parametro può essere passato implicitamente (tramite il classico istanza.metodo, ad esempio), ma viene sempre referenziato esplicitamente. Il primo parametro di ogni metodo contiene sempre l'istanza su cui si lavora, e il programmatore ha l'obbligo di darle un nome, che CONVENZIONALMENTE è self, ma potrebbe essere chiamato s, this, it, ecc.. Questo per i metodi d'istanza; per i metodi di classe il discorso è analogo, salvo che il primo parametro rappresenta l'oggetto classe e in genere lo si chiama cls.
pensavo di modificare cosi:
Sintatticamente, i metodi di una classe vengono invocati "su" un particolare oggetto, e ricevono come parametro (spesso implicito) l'oggetto su cui sono stati invocati. Questo parametro, anche se passato implicitamente, normalmente può essere referenziato esplicitamente; per esempio, a tale scopo in Java si usa la parola chiave this mentre in Python si usa il nome dell'oggetto(per convenzione self)nonostante l'oggetto venga referenziato esplicitamente (anche con l'uso di istanza.metodo) poiché il primo parametro di ogni metodo contiene l'istanza su cui lavora
2) "memoria efficiente"
Opinabile. Ad esempio, quanto occupa un booleano? Un bit, un byte, o una word di processore/virtual machine (32 o 64 bit)?
l'aggettivo efficiente voleva riferirsi a gestione (di memoria e eccezzioni)
2.6) "Questo è uno dei punti di debolezza più evidenti del Java. La mancanza dell'aritmetica dei puntatori rende il Java molto più avido per quanto riguarda la richiesta delle risorse necessarie per l'esecuzione. Dunque se dobbiamo sviluppare applicazioni per sistemi con memoria limitata come potrebbe essere un sistema embedded come una telecamera che supporta l'installazione di applicazioni, non è assolutamente consigliabile l'utilizzo del Java."
Opinabile anche questo. Spesso il maggior uso di risorse dipende dall'implementazione della virtual machine, che fa uso di compilatori JIT.
Inoltre per Java esistono delle "micro VM" che occupano pochissime risorse e vengono impiegate in sistemi embedded "poveri" di hardware (CPU scarse e poca memoria).
aggiungo le tue due frasi.
3.1) "Le caratteristiche più immediatamente riconoscibili di Python sono le variabili non tipizzate"
Come già detto in 1.5, tutte le varibili hanno un preciso tipo. Forse sarebbe meglio che parlassi di linguaggi a tipizzazione statica (Java) e dinamica (Python).
ho trovato informazioni "contrastanti" dicevano che in python le variabili nn hanno tipo e 2 righe sotto che è un linguaggio a forte tipizzazione ...adesso ho capito (si vede che non ho ancora iniziato a "programmarci")
3.2) "Caratteristica distintiva è il supporto nativo, oltre che ai classici tipi quali interi, floating point, stringhe, anche a tipi più evoluti quali interi a grandezza arbitraria"
A partire da Python 3 c'è un solo tipo intero, ed è precisione arbitraria. ho messo interi non perchè ci siano piu tipi interi ma per correttezza "linguistica" mi suonava male oltre che ai classici tipo quali intero,floating point stinghe.
3.2) "Molti altri tipi sono importabili da librerie standard, e nuovi tipi possono essere creati attraverso il costrutto di classe."
Grazie alla metaprogrammazione che mette a disposizione, è possibile creare nuovi tipi (tipi e classi sono la stessa cosa in Python; in ogni caso sono sempre oggetti) senza passare dal costrutto sintattico "class".
questo penso che sia un livello di programmazione troppo elevato per quanto richiestomi dal professore
3.2.2) "Il primo elemento della coppia rappresenta l'indice, detto "chiave", mentre il secondo è il suo valore corrispondente."
La chiave dev'essere sempre un oggetto immutabile o, in generale, "hashable" (per il quale è possibile ottenere un valore hash numerico "stabile", cioè che allo stesso insieme di dati che costituisce una chiave ritorni sempre lo stesso valore di hash). inserisco la precisazione utile a cui non avevo assolutamente pensato.
3.3.1) "Python invece di usare parentesi o parole chiave, usa l'indentazione stessa per indicare i blocchi nidificati (si può usare sia una tabulazione, sia un numero arbitrario di spazi bianchi, ma lo standard Python è di 4 spazi bianchi). "
Mai mischiare tab e spazi in un sorgente Python, proprio perché vengono usati per definire i blocchi. ah...metto che si usa la tabulazione allora.
3.3.5) Potresti parlare anche di PyPy, Cython, e Shedskin, che consentono, ciasciuno nei rispettivi ambiti di utilizzo, di ottenere prestazioni anche molto elevate e comparabili a volte a quelle di linguaggi come Java e C.
questo volevo farlo ma non ho "reperito" una qta di informazioni sufficiente per buttar giu qualche riga (e non solo accennarli vagamente)
cdimauro
31-07-2011, 08:59
non è implicito che definendo attributi e metodi che agiscono sulla classe io definisco il comportamento della classe ?
Il problema sta appunto nella definizione, cioè nel dover definire (prima) i membri in questione. Questo va bene per un linguaggio a tipizzazione statica, dove avviene a compile-time.
Non va bene in un linguaggio a tipizzazione dinamica, dove i membri possono essere definiti al volo, o "emulati" (intercettandone l'accesso), o addirittura aggiunti / rimossi alla bisogna (esempio: posso aggiungere il metodo read in un momento, e rimuoverlo quando non serve più).
Quel che conta è che un oggetto (inteso come istanza di una classe) in un determinato momento sia in grado di "rispondere" a un determinato protocollo.
P.S. Per semplificare ho diviso i linguaggi in due insiemi, a tipizzazione statica o dinamica, ma ovviamente non è sempre così.
questo penso che sia un livello di programmazione troppo elevato per quanto richiestomi dal professore
Sì, quello che avevo scritto in questo preciso punto del discorso è una caratteristica abbastanza avanzata di Python, e per questo la si vede poco in giro.
Considera, comunque, che esistono appositi costrutti sintattici in Python che semplificano molto un certo tipo di metaprogrammazione, e che sono diventati di uso comune.
Mi riferisco ai decoratori, di funzione/metodo e di classe, e non parlarne sarebbe una grave mancanza, IMHO.
ah...metto che si usa la tabulazione allora.
No, ti prego! Si usano sempre gli spazi proprio per evitare problemi. Se n'è discusso anche qui, di recente, in un thread.
Tra l'altro nel documento che definisce il coding style (http://www.python.org/dev/peps/pep-0008/) per il codice di sistema/libreria di Python, è specificato a chiare lettere che è sempre preferibile l'uso degli spazi oltre che fortemente raccomandato.
questo volevo farlo ma non ho "reperito" una qta di informazioni sufficiente per buttar giu qualche riga (e non solo accennarli vagamente)
Potresti prendere qualche informazione dalla home page dei rispettivi progetti (PyPy (http://pypy.org/), Cython (http://cython.org/), Shedskin (http://code.google.com/p/shedskin/)). Penso sia più che sufficiente per offrire qualche utile informazione allo scopo, visto che si tratta di progetti che meritano senza dubbio attenzione per il pythonista che ha bisogno di ottenere elevate prestazioni (senza discostarsi troppo da quello che ha già scritto in Python, e soprattutto dal linguaggio).
Il problema sta appunto nella definizione, cioè nel dover definire (prima) i membri in questione. Questo va bene per un linguaggio a tipizzazione statica, dove avviene a compile-time.
Non va bene in un linguaggio a tipizzazione dinamica, dove i membri possono essere definiti al volo, o "emulati" (intercettandone l'accesso), o addirittura aggiunti / rimossi alla bisogna (esempio: posso aggiungere il metodo read in un momento, e rimuoverlo quando non serve più).
Quel che conta è che un oggetto (inteso come istanza di una classe) in un determinato momento sia in grado di "rispondere" a un determinato protocollo.
tenendo conto il valore della monografia (2 crediti quando l'esame piu facile ne vale minimo 4) posso soprassedere su questa differenza dandola per "implicita"
Considera, comunque, che esistono appositi costrutti sintattici in Python che semplificano molto un certo tipo di metaprogrammazione, e che sono diventati di uso comune.
Mi riferisco ai decoratori, di funzione/metodo e di classe, e non parlarne sarebbe una grave mancanza, IMHO.
come sopra
No, ti prego! Si usano sempre gli spazi proprio per evitare problemi. Se n'è discusso anche qui, di recente, in un thread.
Tra l'altro nel documento che definisce il coding style (http://www.python.org/dev/peps/pep-0008/) per il codice di sistema/libreria di Python, è specificato a chiare lettere che è sempre preferibile l'uso degli spazi oltre che fortemente raccomandato.
modifico subito allora :)
Potresti prendere qualche informazione dalla home page dei rispettivi progetti (PyPy (http://pypy.org/), Cython (http://cython.org/), Shedskin (http://code.google.com/p/shedskin/)). Penso sia più che sufficiente per offrire qualche utile informazione allo scopo, visto che si tratta di progetti che meritano senza dubbio attenzione per il pythonista che ha bisogno di ottenere elevate prestazioni (senza discostarsi troppo da quello che ha già scritto in Python, e soprattutto dal linguaggio). grazie mille stranamente non li trovavo tutti e 3)
mi sono "dato" alla parte di traduzione delle esercitazioni...
esercitazione1:http://www.megaupload.com/?d=6TCUF7F0 (il testo è dentro lo zip)
questa dovrei averla fatta giusta...
l'unica cosa che non ho ben capito è come rendere gli attributi della classe privati...(in java si faceva col private ma non penso esistano parole chiave per farlo in python)
esercitazione2 :http://www.megaupload.com/?d=DXPZOND( il testo è dentro lo zip) non ho capito come realizzare l'ultimo punto (la "console")
esercitazione 3: http://www.megaupload.com/?d=ISJAWYNO nn so come affrontare i punti sui ripartitori e simulazione
banryu79
05-08-2011, 16:45
l'unica cosa che non ho ben capito è come rendere gli attributi della classe privati...(in java si faceva col private ma non penso esistano parole chiave per farlo in python)
In Python si fa attraverso il "name mangling".
http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_Python
In Python si fa attraverso il "name mangling".
http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_Python
perfetto basta inserire i __ davanti al nome grazie mille
esercitazione2 :http://www.megaupload.com/?d=DXPZOND( il testo è dentro lo zip) non ho capito come realizzare l'ultimo punto (la "console")
esercitazione 3: http://www.megaupload.com/?d=ISJAWYNO nn so come affrontare i punti sui ripartitori e simulazione
su queste non so come iniziare" potete darmi 1 mano per favore
cdimauro
05-08-2011, 18:18
In Python si fa attraverso il "name mangling".
http://en.wikipedia.org/wiki/Name_mangling#Name_mangling_in_Python
Occhio che non rende privato nulla. Si usa soltanto per rendere difficile il "clashing" di membri di una classe.
In Python non esiste il concetto di membro privato (o protetto, o interno, finalizzato, ecc.): sono tutti pubblici (e manipolabili a piacimento). ;)
P.S. il Secondo link non funziona. Comunque al momento non ho tempo per verificare i sorgenti, anche se a naso ho visto qualcosa che non mi piace.
esercitazione 3 :http://www.megaupload.com/?d=ISJAWYNO
si si quando hai tempo va benissimo... io intanto vedo di andare avanti x quello che riesco in modo da inserire le modifiche via via:)
sono arrivato a un punto morto ( o meglio 3 XD)
esercitazione 2: per realizzare la console in java nel'esercitazione viene inclusa una libreria ( org.polito.po.Console la cui descrizione è qui http://softeng.polito.it/06CBI/Laboratori/Console.html ) come posso fare a realizzare la stessa cosa in python? (esiste una libreria gia fatta o devo scriverma apposta? xke in tal caso mi sa che mi conviene contattare il professore per farmene dispensare XD)
esercitazione 4: ho trovato come inserire l'eccezzioni ma ho qualche problema sulla loro realizzazione in java venivano realizzare semplicamente come estensione della classe Exception in python nn ho trovato descrizioni o info su come si "creino" ma solo sulla loro gestione....
esercitazione 5. basata sull'uso e implementazione di interfacce...usando Dottore implement Medico (dottore è l'intefaccia della classe medico) come realizzo tale cosa in python (se ha senso farla ovviamente)
cdimauro
08-08-2011, 22:42
sono arrivato a un punto morto ( o meglio 3 XD)
Non preoccuparti: li faremo resuscitare. :cool:
esercitazione 2: per realizzare la console in java nel'esercitazione viene inclusa una libreria ( org.polito.po.Console la cui descrizione è qui http://softeng.polito.it/06CBI/Laboratori/Console.html ) come posso fare a realizzare la stessa cosa in python? (esiste una libreria gia fatta o devo scriverma apposta? xke in tal caso mi sa che mi conviene contattare il professore per farmene dispensare XD)
Supponendo che tu stia usando Python fino alla versione 2.7, usa l'istruzione print per stampare a video delle righe terminate da newline (se, invece, non vuoi che sia stampato il newline, aggiungi un ; alla fine dell'istruzione); per leggere una stringa dallo standard input usa la funzione raw_input().
esercitazione 4: ho trovato come inserire l'eccezzioni ma ho qualche problema sulla loro realizzazione in java venivano realizzare semplicamente come estensione della classe Exception in python nn ho trovato descrizioni o info su come si "creino" ma solo sulla loro gestione....
class MyException(Exception): pass
esercitazione 5. basata sull'uso e implementazione di interfacce...usando Dottore implement Medico (dottore è l'intefaccia della classe medico) come realizzo tale cosa in python (se ha senso farla ovviamente)
class Medico:
def Metodo1(self): pass
def Metodo2(self, x, y): pass
class Dottore(Medico):
def Metodo1(self): print 'Metodo1!'
def Metodo2(self, x, y): print 'Metodo 2. x =', x, 'y =', y
Scusami se sono sintetico, ma ho poco tempo. Dovrebbe comunque essere sufficiente per risolvere i tuoi problemi.
Supponendo che tu stia usando Python fino alla versione 2.7, usa l'istruzione print per stampare a video delle righe terminate da newline (se, invece, non vuoi che sia stampato il newline, aggiungi un ; alla fine dell'istruzione); per leggere una stringa dallo standard input usa la funzione raw_input().
uhm questo permette di "aprire" una finestra tipo console (in stile imput c?) lo so è 1 domanda scema ma il professore è un pelo precisino su ste cose....
class MyException(Exception): pass [quote]
supponevo fosse una cosa del genere... per fargli stampare errore dato non trovato basta mettere un print "errore ...blablabla" nel corpo della classe?
[quote]
class Medico:
def Metodo1(self): pass
def Metodo2(self, x, y): pass
class Dottore(Medico):
def Metodo1(self): print 'Metodo1!'
def Metodo2(self, x, y): print 'Metodo 2. x =', x, 'y =', y
Scusami se sono sintetico, ma ho poco tempo. Dovrebbe comunque essere sufficiente per risolvere i tuoi problemi.
definisco semplicemente un altra classe ocme se fosse un "estensione" dove implemento tutti i metodi (ho capito bene o ho fatto un pasticcio?)
cdimauro
08-08-2011, 23:15
uhm questo permette di "aprire" una finestra tipo console (in stile imput c?) lo so è 1 domanda scema ma il professore è un pelo precisino su ste cose....
Python generalmente ha una finestra di console aperta (al limite riusa quella della shell corrente).
class MyException(Exception): pass
supponevo fosse una cosa del genere... per fargli stampare errore dato non trovato basta mettere un print "errore ...blablabla" nel corpo della classe?
Beh, sì, ti basta piazzarlo nel costruttore (metodo __init__), ma penso sia meglio intercettare l'eccezione:
try:
... codice ...
except MyException:
print 'errore ... blablabla'
definisco semplicemente un altra classe ocme se fosse un "estensione" dove implemento tutti i metodi (ho capito bene o ho fatto un pasticcio?)
Sì, è così. Python non ha il concetto di interfaccia o classe astratta, ma puoi emulare tutto grazie all'ereditarietà (anche multipla, da più classi).
Python generalmente ha una finestra di console aperta (al limite riusa quella della shell corrente).
probabilmente eclipse +pydev x windows la "nasconde" dv nn la ho vista XD
Beh, sì, ti basta piazzarlo nel costruttore (metodo __init__), ma penso sia meglio intercettare l'eccezione:
try:
... codice ...
except MyException:
print 'errore ... blablabla'
nelle esercitazioni che abbiamo fatto la si propaga fino alla classe "principale" che la gestisce semplicemente lanciandolaviene scritto errore e il nome dell'eccezzione (che è l'unica cosa contenuta nella classe eccezzione)
Sì, è così. Python non ha il concetto di interfaccia o classe astratta, ma puoi emulare tutto grazie all'ereditarietà (anche multipla, da più classi).
io mi sto seriamente chiedendo xke ci insegnano java a sto punto XD
cdimauro
09-08-2011, 06:40
probabilmente eclipse +pydev x windows la "nasconde" dv nn la ho vista XD
Vedrai che nei meandri di Eclipse la troverai aperta. :D
nelle esercitazioni che abbiamo fatto la si propaga fino alla classe "principale" che la gestisce semplicemente lanciandolaviene scritto errore e il nome dell'eccezzione (che è l'unica cosa contenuta nella classe eccezzione)
Mi faresti vedere un esempio (minimale) in Java (o lo trovo nell'esercitazione che hai postato)?
io mi sto seriamente chiedendo xke ci insegnano java a sto punto XD
Perché dovete soffrire, come i giapponesi, altrimenti non godete. :p
nelle esercitazioni in java per la console viene creata una classe apposita x farla in python devo metterla semplicemente dentro la classe principale? (ti allego il testo...anchbe se penso che vadano modificati parzialmente pure quelli)
L'intefaccia utente deve essere implementata dalla classe GestioneBiblio, che deve essere costruita passando due parametri: un oggetto Console tramite il quale viene eseguito tutto l'I/O e un oggetto Biblioteca che è destinato a contenere i dati.
Per avviare l'interfaccia utente si usi il metodo start().
Il sistema deve visualizzare un prompt della forma ">" ed accettare i seguenti comandi che devono eseguire le relative operazioni sull'oggetto Biblioteca:
Comando "add": inserimento libro, seguito dai parametri autore, titolo, piano, scaffale e ripiano.
Comando "list": stampa contenuto scaffale, seguito dai parametri piano e scaffale.
Comando "libro": ricerca un libro e stampa la posizione: seguito dai parametri autore e titolo.
Comando "quit": termina l'esecuzione dell'interfaccia (tramite return, NON usando exit()).
I parametri vengono richiesti uno per volta dall'intefaccia utente dopo che è stato inserito il comando.
Vedrai che nei meandri di Eclipse la troverai aperta. :D
Mi faresti vedere un esempio (minimale) in Java (o lo trovo nell'esercitazione che hai postato)?
http://softeng.polito.it/02CBI/ qui ci sono tutte le esercitazioni svolte (dal professore)
questa è la prima esercitazione con le eccezzioni http://softeng.polito.it/02CBI/Laboratori/Distributore_soluzione_J5.zip
Perché dovete soffrire, come i giapponesi, altrimenti non godete. :p
lo pensavo anche io XD
ogni volta che devo usare il costruttore (__init__) mi da questo errore:undefine variable from import __init__
lo invoco cosi: TesseraNonValida.__init__()
l'__init__ in questione è cosi dichiarato:
def __init__(self):
'''
Constructor
'''
print "tessera non valida"
la classe in questione è vuota
Supponendo che tu stia usando Python fino alla versione 2.7, usa l'istruzione print per stampare a video delle righe terminate da newline (se, invece, non vuoi che sia stampato il newline, aggiungi un ; alla fine dell'istruzione); per leggere una stringa dallo standard input usa la funzione raw_input() e se stessi usando una versione successiva?(3.2?) xke raw_input() o raw_input("stringa") mi danno errore
nell'esercitazione 3 ho qulache problema con la realizzazione di questo pezzo:
Il metodo simula() della classe Sistema, effettua i calcoli di portata a partire da ogni sorgente e stampa per ogni elemento connesso a valle le portate in ingresso e in uscita (per lo scarico solo quella in ingresso).
Suggerimento: dato un oggetto, per sapere se è un'istanza di una classe si può usare l'operatore instanceof.
Es.
if(elemento instanceof Sorgente)
per iniziare non so come "sostituire" istanceof... basta un type?
nella "versione java" ogni classe contiene una funzione che stampa di nome+ portata delle uscite ricevendo la portata in ingresso ha senso effettuare lo stesso approccio o mi conviene qualche cosa di diverso?
cdimauro
09-08-2011, 18:54
nelle esercitazioni in java per la console viene creata una classe apposita x farla in python devo metterla semplicemente dentro la classe principale? (ti allego il testo...anchbe se penso che vadano modificati parzialmente pure quelli)
Adesso ho capito. A te serve realizzare un prompt dei comandi interattivo. In questo caso ti serve il modulo cmd (http://docs.python.org/library/cmd.html) che ti permette di gestire anche la history, l'help, ecc.
http://softeng.polito.it/02CBI/ qui ci sono tutte le esercitazioni svolte (dal professore)
questa è la prima esercitazione con le eccezzioni http://softeng.polito.it/02CBI/Laboratori/Distributore_soluzione_J5.zip
OK, ho capito. In Python le eccezioni (occhio che tante volte ti vedo scriverlo con due zeta! :stordita: ) sono gestite molto similmente a Java, con quale piccola differenza.
Ad esempio, BaseException (http://docs.python.org/library/exceptions.html) è la classe base, ma non ha un solo parametro. Il suo costruttore si limita a prelevare l'elenco degli argomenti passati, e a memorizzarlo in una variabile d'istanza chiamata args.
Se vuoi emulare il comportamento di Java e, quindi, quello che è stato fatto nelle esercitazioni, ti basta definire una tua classe base, derivata da Exception, il cui costruttore preveda un solo parametro che conserverà, ad esempio, in una variabile d'istanza chiamata message.
Potrai poi estendere tutte le altre eccezioni da questa.
lo pensavo anche io XD
Amerai Python per questo. :cool:
e se stessi usando una versione successiva?(3.2?) xke raw_input() o raw_input("stringa") mi danno errore
Con Python 3.x ci sono stati alcuni importanti cambiamenti al linguaggi, che lo rendono non perfettamente retrocompatibile.
Nello specifico, in Python 3 non esiste più l'istruzione print, ma la funzione print (che, essendo funzione, richiede per forza la coppia di parentesi tonde in cui racchiudere gli argomenti) e la funzione raw_input adesso si chiama input (mentre è sparita la funzione input, che può essere però emulata con eval(input())).
Adesso ho capito. A te serve realizzare un prompt dei comandi interattivo. In questo caso ti serve il modulo cmd (http://docs.python.org/library/cmd.html) che ti permette di gestire anche la history, l'help, ecc.
conosci mica un link dv spiega il funzionamento e quali funzioni permette di utilizare tale modulo?
OK, ho capito. In Python le eccezioni (occhio che tante volte ti vedo scriverlo con due zeta! :stordita: ) sono gestite molto similmente a Java, con quale piccola differenza.
Ad esempio, BaseException (http://docs.python.org/library/exceptions.html) è la classe base, ma non ha un solo parametro. Il suo costruttore si limita a prelevare l'elenco degli argomenti passati, e a memorizzarlo in una variabile d'istanza chiamata args.
Se vuoi emulare il comportamento di Java e, quindi, quello che è stato fatto nelle esercitazioni, ti basta definire una tua classe base, derivata da Exception, il cui costruttore preveda un solo parametro che conserverà, ad esempio, in una variabile d'istanza chiamata message.
Potrai poi estendere tutte le altre eccezioni da questa.
per questo mi sa conviene che chiedo al professore come preferisce che venga realizzata tale cosa... se in modo piu "sbrigativo" (estensione di una fantomatica classe Exception avente nel corpo solo una print "errore") o un qualcosa di piu preciso... (il corso di programmazione a oggetti facendo parte della laurea triennale "ingnora" (esclusa propagazione e intercettazione) eccezzioni e altre cose quindi non so cosa preferisca....
Con Python 3.x ci sono stati alcuni importanti cambiamenti al linguaggi, che lo rendono non perfettamente retrocompatibile.
Nello specifico, in Python 3 non esiste più l'istruzione print, ma la funzione print (che, essendo funzione, richiede per forza la coppia di parentesi tonde in cui racchiudere gli argomenti) e la funzione raw_input adesso si chiama input (mentre è sparita la funzione input, che può essere però emulata con eval(input())).
ecco xke raw_input mi dava errore XD
cdimauro
09-08-2011, 22:36
conosci mica un link dv spiega il funzionamento e quali funzioni permette di utilizare tale modulo?
I primi 5 link di questa (http://www.google.it/search?client=opera&rls=it&q=python+cmd+example&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest) ricerca sono sufficienti allo scopo.
per questo mi sa conviene che chiedo al professore come preferisce che venga realizzata tale cosa... se in modo piu "sbrigativo" (estensione di una fantomatica classe Exception avente nel corpo solo una print "errore")
Un paio di suggerimenti. Il primo è che la classe Exception è già definita, ed è quella che devi estendere. Il secondo è che non devi eseguire nessuna print, perché nemmeno Java lo fa quando viene sollevata un'eccezione (e negli esercizi non c'è nessuna print).
Un altro, infine, da pythonista: cerca di non ricalcare esattamente come vengono risolto i problemi con gli altri linguaggi, ma di vedere come sia possibile farlo in Python, con la sua filosofia. ;)
o un qualcosa di piu preciso... (il corso di programmazione a oggetti facendo parte della laurea triennale "ingnora" (esclusa propagazione e intercettazione) eccezzioni e altre cose quindi non so cosa preferisca....
E' un vero peccato. Le eccezioni sono dei pilastri della buona programmazione (se usati correttamente, ovviamente; come per tutte le cose).
E' un vero peccato. Le eccezioni sono dei pilastri della buona programmazione (se usati correttamente, ovviamente; come per tutte le cose).
non per niente il primo periodo del 1 anno della magistrale c'è un altro corso di programmazione a oggetti:)
al momento sono ko domani mi metto e faccio le oportune modifiche (mi hai dato parecchio materiale da usare per sistemare le esercitazioni) grazie mille
cdimauro
09-08-2011, 23:07
Di nulla. Comunque non m'ero accorto di questo, perché hai editato.
nell'esercitazione 3 ho qulache problema con la realizzazione di questo pezzo:
per iniziare non so come "sostituire" istanceof... basta un type?
isinstance(Oggetto, Classe) oppure isinstance(Oggetto, (Classe1, Classe2, ..., ClasseN))
O ancora type(Oggetto) == Classe
isinstance è la strada preferita dai pythonisti.
nella "versione java" ogni classe contiene una funzione che stampa di nome+ portata delle uscite ricevendo la portata in ingresso ha senso effettuare lo stesso approccio o mi conviene qualche cosa di diverso?
Questa non l'ho capita. Potresti spiegarlo meglio?
P.S. Ora però vado a nanna, e domani si lavora.
Questa non l'ho capita. Potresti spiegarlo meglio?
la funzione simula (Il metodo simula() della classe Sistema, effettua i calcoli di portata a partire da ogni sorgente e stampa per ogni elemento connesso a valle le portate in ingresso e in uscita (per lo scarico solo quella in ingresso). ) viene implementata in ciascuan classe (tubo,rubinetto,ripartitore, ogni clase ne ha una proprio diversa a seconda delle caratteristiche dell'elemento e la funzione principale si "oppuca" solo di richiamarla dandogli il corretto input (qta che entra nel tubo)
sistemato eccezioni e ho scritto cosi la "console"
import Libro
import cmd
import sys
class GestioneBiblio(cmd.Cmd):
'''
classdocs
'''
biblio=None
def __init__(self,biblio):
'''
Constructor
'''
self.biblio=biblio
cmd.Cmd.__init__(self)
self.prompt='>'
def do_start(self):
print "* Gestione Biblioteca *"
def do_add(self):
aut=cmd.Cmd.use_rawinput("inserire autore")
tit=cmd.Cmd.use_rawinput("inserire titolo")
piano=cmd.Cmd.use_rawinput("inserire piano")
ripiano=cmd.Cmd.use_rawinput("inserire ripiano")
scaf=cmd.Cmd.use_rawinput("inserire scaffale")
libr=Libro(tit,aut)
self.biblio.inserisci(piano,scaf,ripiano,libr)
def do_list(self):
piano=int(cmd.Cmd.use_rawinput("inserire piano"))
scaffale=cmd.Cmd.use_rawinput("inserire scaffale")
self.biblio.__piani[piano].__scaffali.contiene(scaffale)
def do_libro(self):
aut=cmd.Cmd.use_rawinput("inserire autore")
tit=cmd.Cmd.use_rawinput("inserire titolo")
libr=Libro(tit,aut)
self.biblio.Cerca(libr)
def do_quit(self):
sys.exit()
gestbiblio=GestioneBiblio()
gestbiblio.cmdloop()
mi da errore questa linea di codice:
if isinstance(elem,Sorgente):
dice che Sorgente non è una variabile definita ma tale classe è definita come estensione della classe Elemento
class Elemento(object):
'''
classe elemento "base"
'''
_nome=""
_uscita=""
class Sorgente(Elemento):
'''
classe Sorgente estensione della classe Elemento
'''
__portata=0
cdimauro
10-08-2011, 16:21
la funzione simula ( ) viene implementata in ciascuan classe (tubo,rubinetto,ripartitore, ogni clase ne ha una proprio diversa a seconda delle caratteristiche dell'elemento e la funzione principale si "oppuca" solo di richiamarla dandogli il corretto input (qta che entra nel tubo)
Puoi fare lo stesso, ma in Python puoi evitare di scrivere le interfacce.
Nello specifico, è sufficiente che ogni classe abbia definito la funzione simula, col numero di parametri che ci si aspetta.
mi da errore questa linea di codice:
if isinstance(elem,Sorgente):
dice che Sorgente non è una variabile definita ma tale classe è definita come estensione della classe Elemento
class Elemento(object):
'''
classe elemento "base"
'''
_nome=""
_uscita=""
class Sorgente(Elemento):
'''
classe Sorgente estensione della classe Elemento
'''
__portata=0
Dipende da dove hai definito Sorgente. Se si trova nello stesso file non c'è problema. Se è in un altro file / modulo, devi eseguire un import del modulo e utilizzarne il nome per accedervi. Esempio:
import Classi
if isinstance(Oggetto, Classi.Sorgente):
sorgente è un estensione della classe elemento...definita nel modulo (classe) Elemento che ho importato....
( ho un errore simine nell'altra esercitazione dove devo usare il costruttore di una classe che ne estende un altra..) quindi penso che sia dovuto al fatto che nn sia la 1 classe definita nel modulo e che richiesta una sintassi leggermente diversa....
devo fare quindi Elemento.Sorgente?
cdimauro
10-08-2011, 22:14
Sì, se la classe Elemento è definita nel modulo Elemento.py, mentre la classe Sorgente suppongo sia definita nel modulo Sorgente.py.
In Python fortunatamente NON sei obbligato a usare un file per ogni classe (una cosa stupidissima di Java che non ho mai condiviso). Le classi "relazionate" fra di loro le metto usualmente nello stesso modulo. ;)
Sì, se la classe Elemento è definita nel modulo Elemento.py, mentre la classe Sorgente suppongo sia definita nel modulo Sorgente.py.
In Python fortunatamente NON sei obbligato a usare un file per ogni classe (una cosa stupidissima di Java che non ho mai condiviso). Le classi "relazionate" fra di loro le metto usualmente nello stesso modulo. ;)
sorgente sta dentro lo stesso file di elemento (essendo una sua estensione mi pareva logica come cosa) quindi metto Elemento.Sorgente :D grazie....corretti questi 2 errori mi resta solo l'ultima esercitazione (anche se sarei piu tranquillo se qualcuno desse una occhiata ai sorgenti ) e la creazione dei test per una esercitazione.
La parte "difficile" dell'ultima esercitazione è un interfaccia grafica domani mi metto a farla:D
per i test non so proprio come fare...neanche in java erano parte del corso.......
ti ringrazio ancora molto per l'attenzione:)
cdimauro
11-08-2011, 06:51
sorgente sta dentro lo stesso file di elemento (essendo una sua estensione mi pareva logica come cosa) quindi metto Elemento.Sorgente :D
No, allora non dovrebbe servire. In questi casi non serve nessun qualificatore.
A questo punto posta l'intero sorgente, così posso vedere meglio perché, pur usando lo stesso file, hai problemi.
grazie....corretti questi 2 errori mi resta solo l'ultima esercitazione (anche se sarei piu tranquillo se qualcuno desse una occhiata ai sorgenti )
La prossima settimana sono in ferie e dovrei avere tempo.
Appena finisci, crea un archivio zip con le cartelle delle esercitazioni, e allegala a un messaggio qui sul forum.
e la creazione dei test per una esercitazione.
La parte "difficile" dell'ultima esercitazione è un interfaccia grafica domani mi metto a farla:D
Per questo su Python non ti potrò aiutare, perché non ho mai scritto applicazioni dotate di GUI.
In realtà usando IronPython e Silverlight non dovrei avere problemi, ma penso che a te interessa usa soluzione basata su CPython (è l'implementazione di Python più comune).
per i test non so proprio come fare...neanche in java erano parte del corso.......
I test sono di una banalità incredibile:
import unittest
class FirstTest(unittest.TestCase):
def setUp(self):
pass # Metti eventuale codice di inizializzazione dei test
def tearDown(self):
pass # Metti codice di "pulizia" alla fine dei test
def test_prova(self):
self.assertTrue(True) # Se True è logicamente uguale a True ti sei salvato :D
class SecondTest(unittest.TestCase):
def test_altra_prova(self):
def DivideOrDie(x):
x / 0
self.assertRaises(ZeroDivisionError, DivideOrDie, 1234567890)
def test_ancora(self):
self.assertEquals(1, 1) # Se 1 è uguale a 1 ti sei salvato di nuovo.
if __name__ == '__main__':
unittest.main()
Da notare che tutti i metodi da testare devono iniziare con "test" in modo da essere automaticamente recuperati dal modulo unittest, ed eseguiti.
A questo punto se il file si chiama Tests.py, ti basta:
python Tests.py
per lanciare i test.
Se usi NetBeans è molto più comodo, perché ti basta essere dentro il file Tests.py e premete Ctrl-F6 per lasciare che sia l'IDE a recuperare tutti i test ed eseguirli fornendoti il risultato con una bella interfaccia grafica.
ti ringrazio ancora molto per l'attenzione:)
Di nulla. Per me è solo una questione di tempo, purtroppo.
sto utilizzando eclipse...
quinsi de ho ben capito per i testmi basta creare un modulo contenente unittest.
questo modulo deve avere varie classi (1 per ogni test) ogni classe deve avere dei metodi per inizializzazione e "pulizia" e il corpo del test vero e proprio...
mal che vada apro qeulli fatti dal professore in java e vedo che test fa:D
uppato i sorgenti di dove ho l'errore...http://www.megaupload.com/?d=1T88OZ9K
edit risolto voelva nomefile.classe
cdimauro
11-08-2011, 15:33
sto utilizzando eclipse...
Condoglianze. :D
quinsi de ho ben capito per i testmi basta creare un modulo contenente unittest.
questo modulo deve avere varie classi (1 per ogni test) ogni classe deve avere dei metodi per inizializzazione e "pulizia" e il corpo del test vero e proprio...
Non esattamente. Puoi avere quante classi vuoi, ognuna con quanti test vuoi (anche zero; io, ad esempio, ne creo qualcuna per definire alcune operazioni comuni ad altre classi di test, che estendono da quella o quelle "base"), e non è necessario definire sempre i metodi di inizializzazione e pulizia.
L'esempio che ho fornito prima era solo per avere un quadro abbastanza completo di quello che si può fare, ma non è obbligatorio seguirlo.
In teoria potresti anche avere una sola classe con tutti i test, e nessuna operazione di inizializzazione o finalizzazione. Dipende tutto dagli obiettivi che ti poni.
Nel mio caso, che sviluppo principalmente API, per ogni realizzo una classe con tutti i test che esercitano le condizioni di errore e il comportamento che ci si aspetta dall'API a seconda dei possibili scenari di utilizzo.
mal che vada apro qeulli fatti dal professore in java e vedo che test fa:D
Può essere utile, ma segui lo schema che ho realizzato prima, che è già "pythonico". ;)
P.S. I file allegali qui sul forum. C'è l'apposito bottone "Gestisci allegati" che ti permette di farlo comodamente e velocemente senza passare da MegaUpload. :fagiano:
P.S. I file allegali qui sul forum. C'è l'apposito bottone "Gestisci allegati" che ti permette di farlo comodamente e velocemente senza passare da MegaUpload nn lo avevo visto XD(sn io o si puo caricare sl 1 file x volta? quello mi ha fatto caricare XD)
esercitazione 1: caricata con l'apposito tool del forum
esercitazione 2: http://www.megaupload.com/?d=X7RZ2Y42
esercitazione 3: http://www.megaupload.com/?d=GT43RK4K
esercitazione 4: http://www.megaupload.com/?d=7TGYHEFR
esercitazione 5: http://www.megaupload.com/?d=BTK9M7ZB
queste esercitazioni le ho finite quindi faccio che caricarle...
i test pensavo di farli o per la 2 esercitazione o per la quarta...
ho qualche problema sull'ultima esercitazione...sospendo e passo a fare i test (cosi magari mi tiri le orecchie per bene per gli errori nelle esercitazioni precedenti :D)
cdimauro
12-08-2011, 07:34
Si possono allegare più file (al limite puoi mettere tutte le esercitazioni dentro un solo file zip).
Appena ho abbastanza tempo me le leggo per vedere lo stile che hai usato (suppongo che siano logicamente corretti).
piu che altro mi preoccupan l'aver fatto "casino" coi metodi di dizionari,liste ecc
logicamente dovrebbero essere correttìe queste....ho qualche probelma sulla sesta o meglio su come trattare una stringa che rappresenta il path di un file (cartella1/cartella2/cartella3) e devo scorrere ricorsivamente per arrivare al fondo...io splitterei sul carattere (/) la stringa per trasformarla in una lista poi se la lista contiene un unico elemento (esiste un lista.lenght??) ritorno quello altrimenti se non è vuota elimino l'elemento 0 e ricorro ...
le prime 2 esercitazioni dovrebbe essere corrette...
se nn è 1 problema per il regolamento del forum continuerei a usare megaupload (mi trovo piu comodo)
ho modificato le esercitazioni 3-4-5 quindi le riuppo in un unico archivio con le precedenti....
ho finito l'esercitazione 6 (esclusa la parte sulla grafica che nn ho capito come fare) ho qualche dubbio sull'esplorazione ricorsiva delle cartelle a partire dal path (stringa)
non riesco a capire come iniziare con l'interfaccia grafica....dato che il professore aveva detto che l'ultima eserictazione potevo non farla aspetto che mi risponda via mail prima di sbatterci troppo la testa...nel frattempo aspetto che mi caziate per bene su quello che ho fatto XD
cdimauro
20-08-2011, 10:44
piu che altro mi preoccupan l'aver fatto "casino" coi metodi di dizionari,liste ecc
logicamente dovrebbero essere correttìe queste....ho qualche probelma sulla sesta o meglio su come trattare una stringa che rappresenta il path di un file (cartella1/cartella2/cartella3) e devo scorrere ricorsivamente per arrivare al fondo...io splitterei sul carattere (/) la stringa per trasformarla in una lista poi se la lista contiene un unico elemento (esiste un lista.lenght??)
Sì, c'è la funzione standard len. len('pippo') == 5.
ritorno quello altrimenti se non è vuota elimino l'elemento 0 e ricorro ...
Può andare, ma potrei usare la funzione rsplit, che esegue lo split partendo da destra, mettendo anche il numero massimo di split a 1.
Comunque non ho ben chiaro cosa vorresti fare. Magari esiste una soluzione (o funzione :D) più elegante.
le prime 2 esercitazioni dovrebbe essere corrette...
se nn è 1 problema per il regolamento del forum continuerei a usare megaupload (mi trovo piu comodo)
ho modificato le esercitazioni 3-4-5 quindi le riuppo in un unico archivio con le precedenti....
L'archivio unico da piazzare come allegato lo preferisco. Al limite un solo archivio su megaupload. :)
ho finito l'esercitazione 6 (esclusa la parte sulla grafica che nn ho capito come fare) ho qualche dubbio sull'esplorazione ricorsiva delle cartelle a partire dal path (stringa)
Io purtroppo ho ancora meno di tempo rispetto a prima, perché questi giorni di ferie li ho trascorsi in campagna da mio nonno 95enne (con tutti i problemi di salute che si porta dietro) e... lavorando (siccome sono masochista, ai 3 lavori che già avevo ne ho aggiunto un altro :D).
Comunque esponi meglio il tuo problema, così cerco di capire come aiutarti.
non riesco a capire come iniziare con l'interfaccia grafica....dato che il professore aveva detto che l'ultima eserictazione potevo non farla aspetto che mi risponda via mail prima di sbatterci troppo la testa...
Mai realizzato interfacce grafiche in Python, per cui al momento non saprei come aiutarti.
Per il nuovo lavoro penso di usare IronPython e WPF o Silverlight come framework per costruire l'interfaccia grafica che m'è stata richiesta, ma al momento sto bombardando il mio cervello di nuove nozioni per capire meglio quale soluzione adottare e come muovermi.
nel frattempo aspetto che mi caziate per bene su quello che ho fatto XD
Intanto ti allego un archivio con la prima esercitazione corretta. Troverai il tuo codice commentato, a seguire commenti precisi sulle motivazioni, e poi il codice corretto.
Intanto te lo studi, e rivedi poi le altre esercitazioni sulla luce di quei consigli, se ne hai voglia. Se avrò altro tempo mi rivedrò anche le altre, ma al momento non ti posso promettere nulla.
l'ultima esercitazione serve per emulare un file sistem cartelle file ecc...viene dato un path (esempio c/documenti/Andrea/pippo.txt) e io devo a partire dalla cartella di partenza (nell'esempio c) verificare se il file (o cartella) indicati dal path esistono ( e se esistono ritornarli) ho pensato di fare uno split in modo da avere una "lista" ogni volta scendere nelle cartelle usando il 1 elemento della lista come "indice" e poi eliminarlo finchè la lista nn contiene un solo elemento...se quell'elemento esiste nellla cartella in cui sono lo ritorno altrimenti ritorno che nn è presente....
da lunedi mi metto a studiare l'esercitazione che mi hai corretto e a modificare di conseguenza le altre spero di fare il prima possibile :) grazie mille per la disponibilità e l'aiuto
cdimauro
21-08-2011, 09:08
Di nulla. Per il problema del path, in effetti con uno split (usando il carattere / ) te ne dovresti uscire fuori agevolmente.
non ho capito xke dici che è inutile definire le variabili
Variabili di classe inutili
__nome=""
__cognome=""
__telefono=""
xke sono vuote e quindi basta dichiararle nel costruttore? probabilmente xke python è un linguaggio a tipiz dinamica quindi basta farlo nel costruttore ma sn abituato a linguaggi statici (tipo co java) e ne vorrei la conrferma
Infine, il name mangling della classe (usato per tutte le varibili che iniziano con __) generalmente si usa per evitare rischi di collisione di identificatori quando si fa uso dell'ereditarierà multipla. E non è questo il caso.
io lo ho inserito xke tutte le esercitazioni (in java) sono realizzate rendendo "privati" gli attributi...
provvedo a "rivedere" le altre esercitazioni e a ricaricarle
def primo(self):
'''ritorna la prima versione della rubrica'''
#stringa=self.voci[0].ToString()
# Vedi modifica alla classe Voce.
stringa=str(self.voci[0])
return stringa
il metodo str nella classe voce è definito con def __str__(self) per richiamarlo nn bisogna usare __str__?
esercitazioni riviste...
http://www.megaupload.com/?d=I6HBT6QC
devo usare megaupload xke l'archivio unico supera le dim massime consentite dal forum :(
cdimauro
24-08-2011, 20:53
OK
non ho capito xke dici che è inutile definire le variabili
Variabili di classe inutili
__nome=""
__cognome=""
__telefono=""
xke sono vuote e quindi basta dichiararle nel costruttore? probabilmente xke python è un linguaggio a tipiz dinamica quindi basta farlo nel costruttore ma sn abituato a linguaggi statici (tipo co java) e ne vorrei la conrferma
Il motivo che così hai creato delle variabili di classe, che poi vengono comunque "sovrascritte" perché quando crei un'istanza copi i valori in variabili d'istanza che hanno lo stesso nome.
io lo ho inserito xke tutte le esercitazioni (in java) sono realizzate rendendo "privati" gli attributi...
Appunto: Java. In Python non esistono membri privati: sono tutti pubblici, anche quelli che dichiari con __ all'inizio. L'inizio con due underline serve esclusivamente per il name mangling, e nient'altro.
Per cui il mio consiglio è di evitare come la peste di mimare il comportamento di Java, perché in Python non ha alcun senso.
def primo(self):
'''ritorna la prima versione della rubrica'''
#stringa=self.voci[0].ToString()
# Vedi modifica alla classe Voce.
stringa=str(self.voci[0])
return stringa
il metodo str nella classe voce è definito con def __str__(self) per richiamarlo nn bisogna usare __str__?
No, esiste la funziona built-in str, che provvede poi lei stessa a richiamare __str__ se lo riterrà opportuno.
capito grazie mille per le delucidazioni:)....dovrei aver corretto tutte le esercitazioni successive purtroppo l'archivio unico nn lo posso caricare tramite il forum xke è troppo grande..ho messo i link di megaupload....
lanciando i test della 2 esercitazione mi compare qeusto errore:
Traceback (most recent call last):
File "C:\Users\andrea\Desktop\eclipse\eclipse\plugins\org.python.pydev.debug_2.2.2.2011091514\pysrc\runfiles.py", line 162, in <module>
main()
File "C:\Users\andrea\Desktop\eclipse\eclipse\plugins\org.python.pydev.debug_2.2.2.2011091514\pysrc\runfiles.py", line 72, in main
sys.exc_clear()
AttributeError: 'module' object has no attribute 'exc_clear'
nella stessa esercitazione l'utilizzo di
print "il libro cercato è nel ripiano indicato\n"
fa scattare questo errore :
File "C:\Users\andrea\workspace\Biblioteca (Lab_2)\src\Biblioteca.py", line 27
SyntaxError: Non-UTF-8 code starting with '\xe8' in file C:\Users\andrea\workspace\Biblioteca (Lab_2)\src\Biblioteca.py on line 27, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
allego l'esercitazione in questione
cdimauro
21-09-2011, 14:05
lanciando i test della 2 esercitazione mi compare qeusto errore:
Mi sembra un problema del plug-in che utilizzi, PyDev, e non del tuo codice.
Hai provato a eseguire i test da riga di comando? Probabilmente sparirà quell'errore.
nella stessa esercitazione l'utilizzo di
fa scattare questo errore :
allego l'esercitazione in questione
In Python la codifica standard dei sorgenti è l'ASCII. Se vuoi utilizzare un'altra codifica, devi piazzare una specifica riga di commento come prima riga del codice.
Visto che hai usato l'UTF-8, la riga è questa:
# -*- coding: utf-8 -*-
Mi sembra un problema del plug-in che utilizzi, PyDev, e non del tuo codice.
Hai provato a eseguire i test da riga di comando? Probabilmente sparirà quell'errore.
no nn ho provato...(e sinceramente nn ho ideadi come aprire la riga di comando da windows )
In Python la codifica standard dei sorgenti è l'ASCII. Se vuoi utilizzare un'altra codifica, devi piazzare una specifica riga di commento come prima riga del codice.
Visto che hai usato l'UTF-8, la riga è questa:
# -*- coding: utf-8 -*-
il fatto è che io nn ho fatto "nulla" ho semplicemente scritto print "questo messaggio" e mi dasto errore -.-
anche se inserisco la riga da te scrittami continua a dare errore sulle print
print '* Gestione Biblioteca *'
^
SyntaxError: invalid syntax
cdimauro
21-09-2011, 17:50
Se stai usando Python >= 3.0, la print non è più un'istruzione, ma una funzione. Quindi va usata così:
print('* Gestione Biblioteca *')
allora è dovuto a quello :D....
x lanciare i testa da rida di comando devo scrivere tutto il codice? o mi basta lanciare il file come script?(se si devo metterlo in qualceh cartella poarticolare?)
cdimauro
21-09-2011, 20:30
Se hai scritto i test correttamente facendo uso del modulo unittest, ti basta aggiungere due righe alla fine del file che li contiene:
if __name__ == '__main__':
unittest.main()
A questo punto è sufficiente scrivere Python NomeModulo.py, e tutti i test verranno automaticamente riconosciuti ed eseguiti.
# -*- coding: utf-8 -*-
'''
Created on 12/ago/2011
@author: Andrea
'''
import unittest
from Libro import *
from Biblioteca import Biblioteca
class TestLibro(unittest.TestCase):
pass
lanciando questa classe mi da questi errori
pydev debugger: starting
Traceback (most recent call last):
File "C:\Users\andrea\Desktop\eclipse\eclipse\plugins\org.python.pydev.debug_2.2.2.2011091514\pysrc\pydevd.py", line 1267, in <module>
debugger.run(setup['file'], None, None)
File "C:\Users\andrea\Desktop\eclipse\eclipse\plugins\org.python.pydev.debug_2.2.2.2011091514\pysrc\pydevd.py", line 1020, in run
pydev_imports.execfile(file, globals, locals) #execute the script
File "C:\Users\andrea\Desktop\eclipse\eclipse\plugins\org.python.pydev.debug_2.2.2.2011091514\pysrc\_pydev_execfile.py", line 37, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc) #execute the script
File "C:\Users\andrea\workspace\Biblioteca (Lab_2)\src\Test.py", line 123, in <module>
unittest.main()
File "C:\Python32\lib\unittest\main.py", line 123, in __init__
self.parseArgs(argv)
File "C:\Python32\lib\unittest\main.py", line 191, in parseArgs
self.createTests()
File "C:\Python32\lib\unittest\main.py", line 198, in createTests
self.module)
File "C:\Python32\lib\unittest\loader.py", line 132, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Python32\lib\unittest\loader.py", line 132, in <listcomp>
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Python32\lib\unittest\loader.py", line 100, in loadTestsFromName
parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'Test'
cdimauro
22-09-2011, 13:55
Ho provato con NetBeans, ed è effettivamente ci sono numerosi errori nel file di test.
Da quel che ho visto, il "pattern" è sempre lo stesso: anziché, ad esempio, scrivere Libro.Libro(), scrivi Libro() dove Libro è il modulo che contiene la classe Libro.
I moduli non sono "eseguibili", per cui ti vengono generati parecchi errori.
Intanto fai queste correzioni. Se poi hai ancora problemi, ne riparliamo (stasera, penso).
se scrivo
biblio=Biblioteca.Biblioteca("biblioteca")
invece di
biblio=Biblioteca("biblioteca")
(come da quel che ho capito è giusto fare) mi crea un errore:
Undefined variable from import: Biblioteca Test.py /Biblioteca (Lab_2)/src line 33
nonostante io abbia importato con
from Biblioteca import *
cdimauro
22-09-2011, 21:24
Potresti passarmi gli ultimi sorgenti che ti danno questo problema?
certo eccoli....sicuramente avrò fatto qualche errore da qualche parte :(
cdimauro
23-09-2011, 07:13
Purtroppo ci sono vagonate di errori.
Il più grosso è che usando from Modulo import non puoi poi usare Libro.Libro e Biblioteca.Biblioteca, perché le classi Libro e Biblioteca sono già presenti nel namespace.
Corretto questo, ci sono parecchi altri errori dovuti a una non buona conoscenza del linguaggio.
Ad esempio nella classe Piano hai scritto:
self.nome=self.num
ma questa classe non ha alcun attributo num, perché non l'hai mai impostato prima di utilizzarlo.
Oppure dopo:
self.scaffali={}*MAx_scaffali
I dizionari non si possono "moltiplicare" coi numeri. Tuple e liste sì, ma se sono vuote, rimarranno vuote.
Vedi un po' sistemare tutti questi errori di sintassi: grazie alla test suite non ti sarà difficile. Hai fatto benissimo a scriverla.
Purtroppo ci sono vagonate di errori.
Il più grosso è che usando from Modulo import non puoi poi usare Libro.Libro e Biblioteca.Biblioteca, perché le classi Libro e Biblioteca sono già presenti nel namespace.
e quindi come dovrei correggere questo? facendo import modulo invece che from modulo import ?
cdimauro
23-09-2011, 14:41
Io preferisco sempre importo Modulo, e poi nel codice scrivere Modulo.OggettoCheMiServe.
Così sono sicuro di non sbagliare e, soprattutto, so da dove sto prelevando quell'oggetto.
ho corretto (penso) tutto almeno gli import e il Modulo.Classe trovando anche alcuni altri errori (eseguendo i vari moduli) che ho corretto.
ma l'errore sui test
Traceback (most recent call last):
File "C:\Users\andrea\workspace\Biblioteca (Lab_2)\src\Test.py", line 123, in <module>
unittest.main()
File "C:\Python32\lib\unittest\main.py", line 123, in __init__
self.parseArgs(argv)
File "C:\Python32\lib\unittest\main.py", line 191, in parseArgs
self.createTests()
File "C:\Python32\lib\unittest\main.py", line 198, in createTests
self.module)
File "C:\Python32\lib\unittest\loader.py", line 132, in loadTestsFromNames
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Python32\lib\unittest\loader.py", line 132, in <listcomp>
suites = [self.loadTestsFromName(name, module) for name in names]
File "C:\Python32\lib\unittest\loader.py", line 100, in loadTestsFromName
parent, obj = obj, getattr(obj, part)
AttributeError: 'module' object has no attribute 'Test'
resta
cdimauro
25-09-2011, 09:40
Mah. Non so che dirti. Eseguendo i test con NetBeans gli unici errori che trovo sono quelli effettivamente presenti nei sorgenti:
1) Error:
test_biblio(Test.TestBiblio):
'TestBiblio' object has no attribute 'assertCountEqual'
test_biblio() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:35
run() in c:\Python25\lib\unittest.py:267
2) Error:
testaddsingolo(Test.TestBiblio):
'Biblioteca' object has no attribute 'piani'
inserisci() in C:\tmp\Biblioteca (Lab_2)\src\Biblioteca.py:34
testaddsingolo() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:43
run() in c:\Python25\lib\unittest.py:267
3) Error:
testGetter(Test.TestLibro):
'Libro' object has no attribute 'Autore'
GetAutore() in C:\tmp\Biblioteca (Lab_2)\src\Libro.py:17
testGetter() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:20
run() in c:\Python25\lib\unittest.py:267
4) Error:
testToString(Test.TestLibro):
'Libro' object has no attribute 'ToString'
testToString() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:27
run() in c:\Python25\lib\unittest.py:267
5) Error:
testPosizione(Test.TestPosizioneLibro):
'Biblioteca' object has no attribute 'piani'
inserisci() in C:\tmp\Biblioteca (Lab_2)\src\Biblioteca.py:34
testPosizione() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:96
run() in c:\Python25\lib\unittest.py:267
6) Error:
testRicerca(Test.TestRicercaLibro):
'Biblioteca' object has no attribute 'piani'
inserisci() in C:\tmp\Biblioteca (Lab_2)\src\Biblioteca.py:34
testRicerca() in C:\tmp\Biblioteca (Lab_2)\src\Test.py:115
run() in c:\Python25\lib\unittest.py:267
Finished in 0,137 seconds.
7 tests, 0 failures, 6 errors
Per lo più sono errori semplici, penso di distrazione (piani anziché piano, Autore anziché autore, str(Oggetto) anziché Oggetto.ToString()).
Non ho capito soltanto cosa volevi fare col metodo assertCountEqual.
ho avuto seri problemi in famiglia (e quindi a lavoro) e nn ho potuto lavorarci provvedo subito domani mattina a correggere tutto (e a sottoporre questo problema al professore sperando che risponda in tempi non biblici)
e mi scarico netbeans cosi li faccio girare li e vedo gli errori che ho fatto
cdimauro
03-10-2011, 07:58
Mi spiace molto.
Vedrai che con NetBeans ti troverai bene. Dopo averlo installato, installa i 2 plugin per Python. A questo punto ti basta creare un nuovo progetto Python "con sorgenti esistenti", selezionare la cartella dove si trovano, stando anche attento a scegliere la codifica dei caratteri (imposta manualmente UTF-8: c'è una voce apposita nel wizard di creazione del progetto).
A questo punto sarà tutto pronto. Per eseguire i test, apri il file Test.py e premi Ctrl-F6: farà la scansione del file alla ricerca alla ricerca di tutti i test definiti, e li eseguirà uno per uno dandoti l'output che t'ho incollato prima.
Al solito, se ci sono problemi, scrivi pure sul forum. Appena possibile cercherò di darti una mano (se qualcun altro non ti aiuta prima :)).
con assertcount mi sa che ho sbagliato a cliccare nel menu a tendina x il completamento automatico XD (volevo verificare che non fosse uguale a None)
ho corretto alcune cosd ma è "spuntato" un errore che non so proprio a cosa sia dovuto
File "C:\Users\andrea\Desktop\netbeans\netbeans\python\nb_test_runner.py", line 224
except ValueError, e:
e altri 2 (uno ripetuto) che non capisco come mai escono
ERROR: testaddsingolo (__main__.TestBiblio)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 46, in testaddsingolo
result=biblio.Inserisci(piano,scaffale,ripiano,libr)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Biblioteca.py", line 32, in Inserisci
if (self.piano[piano]).Inserisci(piano,scaffale,ripiano,libro):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Piano.py", line 30, in Inserisci
if(self.scaffali[scaffale].Inserisci(piano,scaffale,ripiano,libro)):
KeyError: 'SC1'
======================================================================
ERROR: testPosizione (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 98, in testPosizione
biblio.Inserisci(manzoni,piano,scaffale,ripiano)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Biblioteca.py", line 32, in Inserisci
if (self.piano[piano]).Inserisci(piano,scaffale,ripiano,libro):
TypeError: list indices must be integers, not Libro
======================================================================
ERROR: testRicerca (__main__.TestRicercaLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 116, in testRicerca
biblio.Inserisci(manzoni,piano,scaffale,ripiano)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Biblioteca.py", line 32, in Inserisci
if (self.piano[piano]).Inserisci(piano,scaffale,ripiano,libro):
TypeError: list indices must be integers, not Libro
cdimauro
03-10-2011, 16:59
Potresti allegare l'archivio con le ultime modifiche?
ero convinto di averlo fatto scusa
cdimauro
03-10-2011, 17:46
Per caso stai utilizzando Python 3?
3.2 si...ho scritto qualche cosa con la sintassi di versioni precedenti?
cdimauro
03-10-2011, 17:58
Già. :D Ecco spiegato perché avevo degli errori così strani.
Vedo di procurarmi la 3.2 senza dover installare nulla nel PC, e riprovo. Ti faccio sapere appena posso.
mannagga a me...quando ho qualche dubbio guardo su internet e molto spesso mi dimentico di controllare che sia compatibile ocn la versione 3.2 e non con quelle precedenti...
io intanto vado avanti a fare main di prova con le altre esercitazioni sperando di nn arenarmi troppo presto
cdimauro
03-10-2011, 20:53
Il primo errore è dovuto al fatto che NetBeans supporta soltanto Python 3.2, per cui al momento non ci può fare nulla.
Fortunatamente lanciando Test.py da linea di comando con Python 3.2 fa il suo sporco lavoro, per cui adesso analizzo un po' i problemi e ti faccio sapere.
cdimauro
03-10-2011, 22:04
Allora, per gli ultimi due errori (TypeError: list indices must be integers, not Libro) il problema è dovuto al fatto che in biblio.Inserisci passi come primo parametro manzoni, che è un'istanza di Libro, mentre dev'essere l'ultimo parametro.
Corretto questo, rimangono sempre 3 errori, KeyError: 'SC1', che sono dovuti a questa riga di codice:
if(self.scaffali[scaffale].Inserisci(piano,scaffale,ripiano,libro)):
di Piano.py.
Il nocciolo della questione è che il dizionario scaffali è vuoto, e tu stai cercando di estrarre il valore associato alla chiave SC1.
Se il tuo obiettivo è soltanto di inserire quel libro nello scaffale SC1, dovresti assicurarti che lo scaffale SC1 sia stato creato e inserito nel dizionario scaffali.
Ciò detto, ho dato un'occhiata veloce al codice, e onestamente tutto mi sembra fuorché codice Python. Si vede chiaramente che è codice pensato in Java e tradotto in Python.
Ma è anche normale. Come per qualunque linguaggio, bisogna maturare una certa esperienza prima di acquisire la giusta mentalità.
Non te ne faccio una colpa, sia chiaro. Anzi, nel poco tempo che hai avuto, hai fatto molto. E' soltanto un'osservazione da pythonista incallito. :D
Adesso vado a letto che sono veramente a pezzi (è da parecchi giorni che faccio l'1 e passa di notte per finire i lavori extra, e oggi il fisico non regge più e reclama il riposo).
uhm hai anche ragione... gli scaffali io li avrei voluti creare (come i ripiani) dato che sono fissi insieme alla creazione della biblioteca stessa in modo da non dover fare questo controllo (e siccome le dimenisioni dei vari piani\scaffali\ripiani sono fisse nn sarebbe nanche male) mi metto a fare qeusta modifica che dovrebbe risolvere questo errore e a modificare il resto...
per lo "stile" copiatura bruta purtropo non saprei come "rimediare" data la mia "esperienza"
cdimauro
04-10-2011, 07:36
Come dicevo, non puoi farci niente: ti manca l'esperienza che serve a plasmare la giusta forma mentis del pythonista. Quello che hai fatto è già un buon passo avanti: se ti piace Python, ti servirà per approfondire l'uso del linguaggio e di quello che offre. ;)
Riguardo al programma, se la struttura è già fissa / predeterminata, approfittane! Costruiscila tutta all'inizio, per poi lavorarci. In questo modo riduci anche i test da effettuare (ti basta testare come precondizione che la struttura su cui stai iniziando a lavorare sia quella che ti aspetti).
Quando ci sono requisiti così espliciti, è sempre meglio cercare di sfruttarli. ;)
dovrei aver sistemato sfruttando i requisiti "statici"...correggi correggi ho 1 errore e 1 failure nei test.
======================================================================
ERROR: testRicerca (__main__.TestRicercaLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 116, in testRicerca
libr=biblio.Cerca(autore,titolo)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Biblioteca.py", line 46, in Cerca
libr=piano.Cerca(autore,titolo)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Piano.py", line 46, in Cerca
libro=scaf.Cerca(autore,titolo)
AttributeError: 'str' object has no attribute 'Cerca'
======================================================================
FAIL: testPosizione (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 99, in testPosizione
self.assertEqual(ripiano, manzoni.GetRipiano, "ripiano errato")
AssertionError: 2 != <bound method Libro.GetRipiano of <Libro.Libro object at 0x000000000263BF98>> : ripiano errato
----------------------------------------------------------------------
Ran 7 tests in 0.007s
FAILED (failures=1, errors=1)
l'errore nn so da dove arrivi....
il failur è dovuto a una cattiva formulazione del test devo verificare che il ripiano in cui ho inserito sia quello "corretto" ma non capisco xke non vada bene il test scritto come lo ho scritto.
cdimauro
04-10-2011, 16:19
Quell'errore a me non l'ha dato. Comunque ho trovato diversi errori, e ho preferito correggerli e allegarti i sorgenti, che però t'invito a confrontare con quelli precedenti per capire perché li hai commessi.
Di seguito quelli che sono rimasti:
c:\tmp\Biblioteca\src>d:\Projects\Python3\C30Python-3.2\PCbuild\python.exe Test.py
EE...EE
======================================================================
ERROR: test_biblio (__main__.TestBiblio)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 35, in test_biblio
self.assertCountEqual(biblio, None, "non riesco a creare la biblioteca")
File "d:\Projects\Python3\C30Python-3.2\lib\unittest\case.py", line 1025, in assertCountEqual
first_seq, second_seq = list(first), list(second)
TypeError: 'Biblioteca' object is not iterable
======================================================================
ERROR: testaddsingolo (__main__.TestBiblio)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 43, in testaddsingolo
result=biblio.inserisci(piano,scaffale,ripiano,libr)
File "c:\tmp\Biblioteca\src\Biblioteca.py", line 29, in inserisci
if self.piani[piano].Inserisci(piano,scaffale,ripiano,libro):
File "c:\tmp\Biblioteca\src\Piano.py", line 26, in Inserisci
if(self.scaffali[scaffale].Inserisci(piano,scaffale,ripiano,libro)):
KeyError: 'SC1'
======================================================================
ERROR: testPosizione (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 96, in testPosizione
biblio.inserisci(piano,scaffale,ripiano,manzoni)
File "c:\tmp\Biblioteca\src\Biblioteca.py", line 29, in inserisci
if self.piani[piano].Inserisci(piano,scaffale,ripiano,libro):
File "c:\tmp\Biblioteca\src\Piano.py", line 26, in Inserisci
if(self.scaffali[scaffale].Inserisci(piano,scaffale,ripiano,libro)):
KeyError: 'SC1'
======================================================================
ERROR: testRicerca (__main__.TestRicercaLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 115, in testRicerca
biblio.inserisci(piano,scaffale,ripiano,manzoni)
File "c:\tmp\Biblioteca\src\Biblioteca.py", line 29, in inserisci
if self.piani[piano].Inserisci(piano,scaffale,ripiano,libro):
File "c:\tmp\Biblioteca\src\Piano.py", line 26, in Inserisci
if(self.scaffali[scaffale].Inserisci(piano,scaffale,ripiano,libro)):
KeyError: 'SC1'
----------------------------------------------------------------------
Ran 7 tests in 0.003s
FAILED (errors=4)
Per il primo, non capisco cosa vorresti fare e perché usi quel particolare tipo di assert.
Gli altri 3 sono identici a quelli già segnalati. Qui devi assicurarti di aver creato lo scaffale prima di inserirci materiale.
mi sono guardato le correzioni e ho realizzato la definiizione "statica" della biblioteca
per quanto riguarda quell'assert ne ho messo un altro per verificare che la biblioteca venga effettivamente creata....
ma restano gli errori che ho scritto prima purtroppo
libro inserito
ERROR: testRicerca (__main__.TestRicercaLibro)
il libro cercato e' nel ripiano indicato
----------------------------------------------------------------------
il libro non e' nel ripiano indicato
Traceback (most recent call last):
libro inserito
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 114, in testRicerca
libr=biblio.Cerca(autore,titolo)
libro inserito
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Biblioteca.py", line 43, in Cerca
libr=piano.Cerca(autore,titolo)
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Piano.py", line 46, in Cerca
libro=scaf.Cerca(autore,titolo)
AttributeError: 'str' object has no attribute 'Cerca'
======================================================================
FAIL: testPosizione (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 97, in testPosizione
self.assertEqual(ripiano, manzoni.GetRipiano, "ripiano errato")
AssertionError: 2 != <bound method Libro.GetRipiano of <Libro.Libro object at 0x000000000266D080>> : ripiano errato
cdimauro
04-10-2011, 21:51
Ho trovato qualche altro bug.
In Libro.py:
def GetScaffale(self):
return self.scaffale
Il nome era sbagliato.
In Piano.py:
def Cerca(self,autore,titolo):
for scaf in self.scaffali.values():
libro=scaf.Cerca(autore,titolo)
return libro
Per iterare sugli scaffali devi estrarli dal dizionario usando il metodo values.
In ogni caso qui c'è sicuramente un errore. Secondo me se il libro l'hai trovato, devi restituirlo immediatamente senza ciclare su tutti gli altri e restituire l'ultimo valore restituito da Cerca.
In Test.py
class TestPosizioneLibro(unittest.TestCase):
pass
def testPosizione(self):
biblio =Biblioteca.Biblioteca("biblioteca");
piano = 1
scaffale = "SC1"
ripiano = 2
manzoni =Libro.Libro("Alessandro Manzoni","I Promessi Sposi")
biblio.Inserisci(piano,scaffale,ripiano,manzoni)
self.assertEqual(ripiano, manzoni.GetRipiano(), "ripiano errato")
self.assertEqual(scaffale, manzoni.GetScaffale(), "scaffale errato")
self.assertEqual(piano, manzoni.GetPiano(), "piano errato")
Hai dimenticato le () alla fine del nome del metodo nelle ultime 3 righe.
Comunque s'intravede la luce. :)
resta un solo errore nel test di ricerca
class TestRicercaLibro(unittest.TestCase):
pass
def testRicerca(self):
biblio =Biblioteca.Biblioteca("biblioteca");
piano = 1
scaffale = "SC1"
ripiano = 2
autore="Alessandro Manzoni"
titolo="I Promessi Sposi"
manzoni =Libro.Libro(titolo,autore)
biblio.Inserisci(piano,scaffale,ripiano,manzoni)
libr=biblio.Cerca(autore,titolo)
self.assertEqual(libr, manzoni, "errore ricerca")
FAIL: testRicerca (__main__.TestRicercaLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
libro inserito
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 115, in testRicerca
self.assertEqual(libr, manzoni, "errore ricerca")
AssertionError: None != <Libro.Libro object at 0x0000000002659C88> : errore ricerca
penso sia dovuto al fatto che quel assert confronta i "puntatori" ai 2 oggetti e per forza sono diversi quindi ho modificato cosi:
[code] def testRicerca(self):
biblio =Biblioteca.Biblioteca("biblioteca");
piano = 1
scaffale = "SC1"
ripiano = 2
autore="Alessandro Manzoni"
titolo="I Promessi Sposi"
manzoni =Libro.Libro(titolo,autore)
biblio.Inserisci(piano,scaffale,ripiano,manzoni)
libr=biblio.Cerca(autore,titolo)
self.assertTrue(libr.Equals(manzoni)==1, "errore ricerca")
ma resta comunque un errore ERROR: testRicerca (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 112, in testRicerca
self.assertTrue(libr.Equals(manzoni)==1, "errore ricerca")
AttributeError: 'NoneType' object has no attribute 'Equals'
----------------------------------------------------------------------
e mi faila il test (che dovrebbe invece passare)
cdimauro
05-10-2011, 13:20
L'errore, come ho già scritto, penso sia dovuto al fatto che Cerca in Piano.py non funziona.
Una soluzione pythonica (che sfrutta i particolari operatori logici and/or; logici != booleano in Python!) per non cambiare troppo il codice, potrebbe essere la seguente:
def Cerca(self,autore,titolo):
libro = None
for scaf in self.scaffali.values():
libro=libro or scaf.Cerca(autore,titolo)
return libro
Oppure, la classica soluzione che si userebbe con qualunque linguaggio:
def Cerca(self,autore,titolo):
for scaf in self.scaffali.values():
libro=scaf.Cerca(autore,titolo)
if libro is not None:
return libro
return libro
Questa è più efficiente e più leggibile per chi non mastica molto Python.
P.S. Non usare Equals in Python per confrontare gli oggetti. Al limite ridefinisci __eq__ e utilizza poi nel codice l'operatore != o ==. ;)
modificato il cerca in piani e l'equals in __eq__ compaiono 2 errori del tipo
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 18, in testCreaLibro
self.assertTrue(l!=None,"errore creazione libro")
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Libro.py", line 23, in __eq__
if (self.titolo==libro.titolo)&(self.autore==libro.autore):
AttributeError: 'NoneType' object has no attribute 'titolo'
sullo stesso punto di codice
def __eq__(self,libro):
if (self.titolo==libro.titolo)&(self.autore==libro.autore):
return 1
return 0
dovuto all'utilizzo di == e != in:
def testCreaLibro(self):
l=Libro.Libro("titolo","Autore")
self.assertTrue(l!=None,"errore creazione libro")
e
def testRicerca(self):
biblio =Biblioteca.Biblioteca("biblioteca");
piano = 1
scaffale = "SC1"
ripiano = 2
autore="Alessandro Manzoni"
titolo="I Promessi Sposi"
manzoni =Libro.Libro(titolo,autore)
biblio.Inserisci(piano,scaffale,ripiano,manzoni)
libr=biblio.Cerca(autore,titolo)
self.assertTrue(libr==manzoni, "errore ricerca")
modificato il cerca in piani e l'equals in __eq__ compaiono 2 errori del tipo
sullo stesso punto di codice
def __eq__(self,libro):
if (self.titolo==libro.titolo)&(self.autore==libro.autore):
return 1
return 0
dovuto all'utilizzo di == e != in:
def testCreaLibro(self):
l=Libro.Libro("titolo","Autore")
self.assertTrue(l!=None,"errore creazione libro")
e
def testRicerca(self):
biblio =Biblioteca.Biblioteca("biblioteca");
piano = 1
scaffale = "SC1"
ripiano = 2
autore="Alessandro Manzoni"
titolo="I Promessi Sposi"
manzoni =Libro.Libro(titolo,autore)
biblio.Inserisci(piano,scaffale,ripiano,manzoni)
libr=biblio.Cerca(autore,titolo)
self.assertTrue(libr==manzoni, "errore ricerca")
Non sono esperto di Python ma sicuro di poter usare &? Dovrebbe eseguire l'and tra bit corrispondenti. Prova con
if self.titolo==libro.titolo and self.autore==libro.autore:
purtroppo resta l'errore
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Test.py", line 18, in testCreaLibro
self.assertTrue(l!=None,"errore creazione libro")
File "C:\Users\andrea\workspace\netbeans\lab2_Biblioteca\src\Libro.py", line 23, in __eq__
if (self.titolo==libro.titolo)and(self.autore==libro.autore):
AttributeError: 'NoneType' object has no attribute 'titolo'
======================================================================
se nn ho frainteso non viene trovato l'attributo titolo dell'oggetto su cui chiamo la funzione ma tale oggetto dovrebbe avere quell'attributo....
cdimauro
05-10-2011, 15:38
Intanto modifica __eq__ in questo modo:
def __eq__(self, other):
if isinstance(other, Libro):
return self.titolo==other.titolo and self.autore==other.autore
raise TypeError('%r non è un libro!' % other)
Quando si usa l'operator overloading su classi user-defined, è sempre consigliabile controllare il tipo dell'altro oggetto.
Nello specifico, se si tratta di un libro, l'operazione prosegue normalmente (NON usando l'operatore & di and binario, come giustamente faceva notare ndakota, ma l'operatore logico and).
Comunque l'errore non è cambiato molto, se non nella forma:
c:\tmp\Biblioteca\src>d:\Projects\Python3\C30Python-3.2\PCbuild\python.exe Test.py
.libro inserito
il libro cercato e' nel ripiano indicato
il libro non e' nel ripiano indicato
.E..libro inserito
.libro inserito
E
======================================================================
ERROR: testCreaLibro (__main__.TestLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 18, in testCreaLibro
self.assertTrue(l!=None,"errore creazione libro")
File "c:\tmp\Biblioteca\src\Libro.py", line 25, in __eq__
raise TypeError('%r non è un libro!' % other)
TypeError: None non è un libro!
======================================================================
ERROR: testRicerca (__main__.TestPosizioneLibro)
----------------------------------------------------------------------
Traceback (most recent call last):
File "Test.py", line 112, in testRicerca
self.assertTrue(libr==manzoni, "errore ricerca")
File "c:\tmp\Biblioteca\src\Libro.py", line 25, in __eq__
raise TypeError('%r non è un libro!' % other)
TypeError: None non è un libro!
----------------------------------------------------------------------
Ran 7 tests in 0.235s
FAILED (errors=2)
Questo perché è meglio cambiare il test:
def testCreaLibro(self):
l=Libro.Libro("titolo","Autore")
self.assertTrue(l,"errore creazione libro")
Così il controllo è corretto, perché qui ci serve soltanto sapere se il libro è stato creato oppure no.
L'ultimo test fallisce perché il libro non viene trovato. E anche qui cambierei il test come prima, intanto per assicurandomi che ci sia un libro (quindi che non sia None), e aggiungendo un altro assert per verificare che sia quello effettivamente cercato.
ho apportato le modifiche che hai detto (ragionandoci un po sopra)
ma il test sulal ricerca continua a fallire...
una piccola modifica alla funzione di ricerca... degli scaffali e adesso dovrebe funzionare dato che nn da failure ne errori
libro inserito
.......
----------------------------------------------------------------------
Ran 7 tests in 0.006s
il libro cercato e' nel ripiano indicato
OK
il libro non e' nel ripiano indicato
libro inserito
libro inserito
grazie mille dell'aiuto
adesos mi metto a fare il main di prova sulle esercitazioni seguenti e appena trovo problemi (cosa che succederà molto presto penso XD) torno a stressarvi XD
e rieccomi a chiedere aiuto xD
esercitazione successiva basata sull'estensione delle classi...
mi compare un errore dice che l'elemento di tipo rubinetto non ha l'attributo nome
Traceback (most recent call last):
elementi -->
Elemento
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Main.py", line 36, in <module>
print(elem._nome)
AttributeError: 'Rubinetto' object has no attribute '_nome'(portataout)
l'oggetto rubinetto è un estensione dell'oggetto Elemento che per l'appunto ha un campo _nome....
cdimauro
05-10-2011, 19:21
L'errore sta nella mancata invocazione del costruttore di Elemento nel costruttore di Rubinetto, che dev'essere definito così:
def __init__(self,nome):
#Elemento(nome) # Errato! Creata un'istanza di Elemento e... la butta via!
super().__init__(name)
self.stato=0 #0= chiuso 1 =aperto
provvedo a modificare il tutto allora perchè non ho fatto cosi in piu posti e a rieseguire...
se io definisco una classe B (che estende A) e una classe C (Che estende sempre A) e dentro B e C definisco un metodo con lo stesso nome a seconda del tipo dell'oggetto su cui io invoco tale metodo viene lanciato quello corretto?
se faccio una lista che contiene un istanza di B una di C quando faccio
lista[i].metodo() viene lanciato quello del tipo giusto?
cdimauro
05-10-2011, 19:43
Sì. Potenza del "duck typing". :cool:
quindi come pensavo ho fatto casino da qualche parte xke ho questo errore
Traceback (most recent call last):
['Ripartitore: ', 'Ripartitore', ': ingresso: ', 0.0]
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Main.py", line 53, in <module>
s.simula()
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Sistema.py", line 25, in simula
elem.simula()
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Elemento.py", line 86, in simula
self._uscita.simula(self.portata)
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Elemento.py", line 118, in simula
self.uscite[1].simula(portata)
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Elemento.py", line 153, in simula
portataout=portata*out.__proporz[i]
AttributeError: 'Rubinetto' object has no attribute '_Ripartitore__proporz'
il fatto è che quando l'oggetto di tipo Rubinetto invoca simula non dovrebbe utilizzare l'attributo che manca secondo l'errore
cdimauro
05-10-2011, 22:24
A naso direi che il problema è dovuto al fatto che hai usato i due __ davanti a un identificatore, e questo ha attivato il meccanismo di name mangling delle classi di Python.
Cerca di evitare l'uso di _ davanti agli identificatori, visto che ancora non conosci questi meccanismi avanzati del linguaggio.
il probelma è che questa esercitazione è basata sull'Inheritance quindi penso che vada proprio utilizzato questo meccanismo...intanto vedo di far funzionare l'esercitazzione "normalmente" e cerco qualche aspeigazione sul name mangling
rimossi tutti i _ resta questo errore:
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Main.py", line 53, in <module>
Split
Ripartitore
s.simula()
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Sistema.py", line 25, in simula
elem.simula()
File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Elemento.py", line 86, in simula
self.uscita.simula(self.portata)
AttributeError: 'NoneType' object has no attribute 'simula'
simula di Sistema:
def simula(self):
for elem in self.lista_elem:
if isinstance(elem,Elemento.Sorgente):
elem.simula()
se l'elemento della lista è una sorgente dovrebbe lanciare elem.simula (il simula di sorgente) altrimenti non deve far niente
def simula(self,portata):
lista=(" nome:")
lista.append(self._nome)
lista.append("ingresso: ")
lista.append(portata)
print (lista)
self.uscita.simula(portata)
simula di Rubinetto se il rubinetto è aperto este tutto se è chiuso non esce niente
def simula(self,portata):
portataout=portata
if self.IsOpen()==0:
portataout=0
lista=[]
lista.append("rubinetto: ")
lista.append(self._nome)
lista.append(" ingresso:")
lista.append(portata)
lista.append(" uscita:")
lista.append(portataout)
return
simula di Scarico stampa semplicemente lo scarico
def simula(self):
lista=[]
lista.append("Sorgente: ")
lista.append(self.nome)
lista.append(": ingresso: ")
lista.append(self.portata)
lista.append(":uscita :")
lista.append(self.portata)
simula dello split stampa e invoca le simula sulle 2 uscite con le portate dimezzate
def simula(self,portata):
portata=portata*0.5
lista=[]
lista.append("Ripartitore: ")
lista.append(self._nome)
lista.append(": ingresso: ")
lista.append(portata)
lista.append(":uscita 0 :")
lista.append(portata)
lista.append(":uscita 1 :")
lista.append(portata)
print (lista)
self.uscite[0].simula(portata)
self.uscite[1].simula(portata)
return
simula del rispartitore simile a quella dello split ma con piu uscite
def simula(self,portata):
lista=[]
lista.append("Ripartitore: ")
lista.append(self._nome)
lista.append(": ingresso: ")
lista.append(portata)
print (lista)
i=0
for out in self.uscite:
portataout=portata*out.proporz[i]
out.simula(portataout)
i=i+1
return
simula di elemento dovrebbe stampare e ricorrere sull' elemento collegatogli in uscita
allego anche i sorgenti
cdimauro
07-10-2011, 07:04
E' colpa del morbo dell'underscore: eliminali tutti (hai usato _uscita e _nome, e allo stesso tempo uscita e nome) e vedrai che la situazione migliorerà. ;)
Altra cosa, quando devi costruire una lista con dei valori che già conosci, non inizializzarla a [] e poi usare append, ma costruiscila direttamente coi valori:
lista=["Ripartitore: ", self.nome, ": ingresso: ", portata]
adesso mi da errore File "C:\Users\andrea\workspace\netbeans\lab3_idraulica\src\Elemento.py", line 130, in simula
portataout=portata*self.proporz[i]
IndexError: list index out of range
def simula(self,portata):
lista=["Ripartitore: ", self.nome, ": ingresso: ", portata]
print (lista)
i=0
for out in self.uscite:
portataout=portata*self.proporz[i]
out.simula(portataout)
i=i+1
la "creazione si proporz avviene cosi:
def __init__(self,nome="",num=0):
super().__init__(nome)
self.num=num
self.num_out=0
self.proporz=[]
def setProporzioni(self,vett):
i=len(vett)
if self.num!=i:
print ("numero errato elementi")
i=0
for out in self.uscite:
out.proporz.append(vett[i])
i=i+1
mi dice che è sbagliato l'indice xke quando lo inizializzo lo metto [] e poi ci appendo le varie cose? xke quando invoco il simula tale vettore non dovrebbe essere vuoto in quando prima ho utilizzato il metdo setproporzioni
rip.setProporzioni([1/3, 1/3, 1/3 ])
cdimauro
07-10-2011, 16:04
Niente, non riesco a venirne a capo così. Potresti postare il codice completo? Grazie.
certo eccolo...sicuramente avrò fatto qualche altro errore scemo....
cdimauro
07-10-2011, 18:17
Allora, il problema è che uscite è vuoto quando invochi setProporzioni, e di conseguenza il vettore proporz rimane vuoto. Per cui quando poi chiami simula e uscite non è vuoto, ma proporz sì, da cui l'errore.
Tra l'altro in setProporzioni tu aggiungeresti elementi al proporz delle uscite, e non all'oggetto stesso, quindi mi aspetto che il programma in ogni caso non funzionerebbe.
Dovresti riempire proporz dell'oggetto corrente, in modo da ritrovartelo riempito quando viene chiamato simula.
Altra cosa, anziché usare:
i=0
for out in self.uscite:
out.proporz.append(vett[i])
i=i+1
potresti fare così:
for i, out in enumerate(self.uscite):
out.proporz.append(vett[i])
Ma meglio ancora sarebbe la funzione zip (che "unisce" due sequenze, restituendo una sequenza in cui ogni elemento è formato da una coppia di elementi, il primo appartenente alla prima sequenza, e il secondo alla seconda):
for out, value in zip(self.uscite, vett):
out.proporz.append(value)
;)
quindi modifico setproporzioni cosi:
def setProporzioni(self,vett):
i=len(vett)
if self.num!=i:
print ("numero errato elementi")
for out, value in zip(self.uscite, vett):
self.proporz.append(value)
e nel main di prova PRIMA collego i pezzi e poi invoco il metodo setproporzioni in modo che quando lo invoco il vettore delle uscite sia gia stato riempito...
e l'esercitazione "gira" ottenendo questo risultato:
elementi -->
Elemento
Rubinetto
Scarico
Sorgente
Split
Ripartitore
['Ripartitore: ', 'Split', ': ingresso: ', 5.0, ':uscita 0 :', 5.0, ':uscita 1 :', 5.0]
['rubinetto: ', 'Rubinetto', ' ingresso:', 5.0, ' uscita:', 0]
['Ripartitore: ', 'Ripartitore', ': ingresso: ', 5.0]
['rubinetto: ', 'Rubinetto2', ' ingresso:', 1.6666666666666665, ' uscita:', 0]
['rubinetto: ', 'Rubinetto3', ' ingresso:', 1.6666666666666665, ' uscita:', 0]
scarico:Scaricoingresso:1.6666666666666665uscita: 1.6666666666666665
tralasciando il fatto "fisico" che se un rubinetto è chiuso ed è collegato a uno "split"il liquido dovrebbe uscire tutto dall'altra uscita dello split (caso che viene completamente ignorato nel testo dell'esercitazione e che quindi posso ignorare anche io) come posso fare a arrotondare tipo a 3 cifre dopo la virgola il risultato? non che sia fondamentale ovviamente....
ancora una volta ti ringrazio per l'aiuto e continuo a chiedertene per la prossima esercitazione (dove ovviamente avrò fatto qualche errore che mi hai gia "corretto" precedentemente ma che non mi entra in testa)
l'errore da me riscontrato è questo:
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\Lab4_distributore\src\main.py", line 22, in <module>
a=d.GetPrice("B1")
File "C:\Users\andrea\workspace\netbeans\Lab4_distributore\src\Distributore.py", line 38, in GetPrice
raise BevandaNonValida.BevandaNonValida()
BevandaNonValida.BevandaNonValida
penso che l'errore stia o nell'utilizzo del dizionario (ma non penso) o nell'utilizzo di questa riga: if (self.bevande.__contains__(cod)is not True ):
all'interno di questa funzione
def GetPrice(self,cod):
if (self.bevande.__contains__(cod)is not True ):
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetPrize()
quindi modifico setproporzioni cosi:
def setProporzioni(self,vett):
i=len(vett)
if self.num!=i:
print ("numero errato elementi")
for out, value in zip(self.uscite, vett):
self.proporz.append(value)
e nel main di prova PRIMA collego i pezzi e poi invoco il metodo setproporzioni in modo che quando lo invoco il vettore delle uscite sia gia stato riempito...
e l'esercitazione "gira" ottenendo questo risultato:
tralasciando il fatto "fisico" che se un rubinetto è chiuso ed è collegato a uno "split"il liquido dovrebbe uscire tutto dall'altra uscita dello split (caso che viene completamente ignorato nel testo dell'esercitazione e che quindi posso ignorare anche io) come posso fare a arrotondare tipo a 3 cifre dopo la virgola il risultato? non che sia fondamentale ovviamente....
ancora una volta ti ringrazio per l'aiuto e continuo a chiedertene per la prossima esercitazione (dove ovviamente avrò fatto qualche errore che mi hai gia "corretto" precedentemente ma che non mi entra in testa)
l'errore da me riscontrato è questo:
penso che l'errore stia o nell'utilizzo del dizionario (ma non penso) o nell'utilizzo di questa riga: if (self.bevande.__contains__(cod)is not True ):
all'interno di questa funzione
def GetPrice(self,cod):
if (self.bevande.__contains__(cod)is not True ):
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetPrize()
Prova così
if not self.bevande.__contains__(cod):
purtroppo continua a dare lo stesso problema :( quindi deducio di aver fatto altri casini e scivo il codice di quei 2 metodi (i primi 2 tra l'altro xD)
l'inserimento della bevanda avviene tramite la funzione aggiungi bevanda
class Distributore(object):
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
self.bevande={}
self.tessere={}
self.colonne=["","","",""]
self.col_piena=0
def AggiungiBevanda(self,nome,codice,prezzo):
self.bevande[codice]=Bevanda.Bevanda(codice,nome,prezzo)
def GetPrice(self,cod):
if not self.bevande.__contains__(cod):
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetPrize()
cdimauro
08-10-2011, 09:06
Per l'arrotondamento:
print("%.3f" % Valore)
Per controllare se una chiave non esiste in un dizionario (che è il nostro caso):
if cod not in self.bevande:
P.S. Di nulla. Tempo permettendo, cercherò di aiutarti.
nonostante tale correzione continua a sollevare l'eccezzione (e non dovrebbe) purtroppo
allego i sorgenti. Grazie di tutto :)
cdimauro
09-10-2011, 22:35
Finalmente ho avuto tempo per dargli un'occhiata.
Il problema è che, come già è capitato altre volte, hai scambiato due parametri:
AggiungiBevanda(self,nome,codice,prezzo)
Infatti poi la chiami scambiando i valori:
d.AggiungiBevanda("B1","Cola", 2.00)
Per cui nel dizionario ci finisce Cola e non B1.
Cerca di rivedere bene i sorgenti, perché sono errori ricorrenti, e che fanno perdere tempo, in quanto il codice della funzione sembra tutto a posto.
riguardnato i sorgenti ho corretto un paio di errori che per me sono "classici" come invertire i parametri o sbagliare una maiuscola e fino all'ultima funzione (eroga) funziona tutto ma quando arriva a questa funzione non avviene quello che dovrebbe. mettendo un po di "print" mi sono accorto che quando chiamo il metodo bevanda.GetNome invece che ritornare (ad esempio) cola ritorna
:<bound method Bevanda.GetNome of <Bevanda.Bevanda object at 0x000000000257CAC8>> avendo usato str() altrimenti dice che non si puo convertire automaticamente in stringa. e di conseguenza la funzione eroga non fa quello che deve
e penso che l'erroe sia nel GetNome qui
Bevanda:
class Bevanda(object):
'''
classdocs
'''
def __init__(self,cod="",nome="",prezzo=0.0):
'''
Constructor
'''
self.nome=nome
self.cod=cod
self.prezzo=prezzo
def GetPrize(self):
return self.prezzo
def GetCod(self):
return self.cod
def GetNome(self):
return self.nome
distributore
import Tessera
import Bevanda
import Colonna
import TesseraNonValida
import BevandaNonValida
import BevandaEsaurita
import CreditoInsufficiente
QTA_COLONNE=4
class Distributore(object):
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
self.bevande={}
self.tessere={}
self.colonne=["","","",""]
self.col_piena=0
def AggiungiBevanda(self,codice,nome,prezzo):
self.bevande[codice]=Bevanda.Bevanda(codice,nome,prezzo)
def GetPrice(self,cod):
if cod not in self.bevande:
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetPrize()
def GetName(self,cod):
if cod not in self.bevande:
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetNome
def GetName(self,cod):
if cod not in self.bevande:
raise BevandaNonValida.BevandaNonValida()
return self.bevande[cod].GetNome()
Non conosco bene Python perchè ho appena iniziato ad impararlo anche io ma non mettere le tonde () in una chiamata di funzione dà errore in Python3. Prova un po'.
dov'è che nn le avrei messe? (xke mi pare di averle messe dove servissero) in relatà non "solleva" errori ma ritorna una cosa che non è la stringa contenente il nome.
Si hai ragione, non dà errore in realtà. Volevo dire che restituisce qualcosa che non è il valore restituito dalla funzione. Comunque non le hai messe esattamente nell'ultima riga dell'ultimo sorgente del tuo penultimo post(ultima riga del metodo GetName).
cdimauro
10-10-2011, 14:21
dov'è che nn le avrei messe? (xke mi pare di averle messe dove servissero) in relatà non "solleva" errori ma ritorna una cosa che non è la stringa contenente il nome.
Se non metti le parentesi il metodo non viene invocato, per cui Python... ti restituisce il metodo stesso. :p
ok si trovato (vivo proprio tra le nuvole -.-) quando tutto è fattibile il programma gira ma quando qualche dato non va bene
es tessera insesistente:
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\Lab4_distributore\src\main.py", line 81, in <module>
except BevandaEsaurita.BevandaEsaurita():
TypeError: catching classes that do not inherit from BaseException is not allowed
tutte le eccezioni sono definite cosi:
class TesseraNonValida(Exception):
'''
classdocs
'''
def __init__(self,messaggio="tessera non valida"):
'''
Constructor
'''
self.message=messaggio
sicuro non si definiranno cosi...
cdimauro
10-10-2011, 18:23
Sono di fretta, ma a naso penso di aver capito:
except BevandaEsaurita.BevandaEsaurita():
Togli le parentesi tonde alla fine. A te interessa intercettare quell'eccezione, non costruirne un'istanza. Quindi:
except BevandaEsaurita.BevandaEsaurita:
E' la sintassi corretta.
Ricorda che se "chiami" una classe in Python ne crei un'istanza, e questo vale per qualunque classe (quindi anche le eccezioni). ;)
grazie mille :)anche questa esercitazione è sistemata devo finire il main di prova della prossima e (anche se spero di no) tornerò a chiedere xke nn funzioni a dovere :D
sono durato poco senza chiedere aiuto :( e sicuramente sarà 1 errore che mi avete gia corretto precedentemente ma nn riesco a venerne a capo purtroppo
il metodo GetPersona lancia l'eccezione quando non dovrebbe ( ho contollato ma mi pare che i parametri delle funzioni siano corretti)
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\Lab5_sanita\src\main.py", line 25, in <module>
pers=san.GetPersona(cod_fisc)
File "C:\Users\andrea\workspace\netbeans\Lab5_sanita\src\Sanita.py", line 29, in GetPersona
raise ErrPersonaInesistente.ErrPersonaInesistente()
ErrPersonaInesistente.ErrPersonaInesistente
import Persona
import ErrPersonaInesistente
import ErrMedicoInesistente
class Sanita(object):
'''
classdocs
'''
def __init__(self):
'''
Constructor
'''
self.persone={}
self.pazienti={}
self.medici={}
def AggiungiPersona(self,nome,cognome,cod_fisc):
self.pazienti[cod_fisc]=Persona.Paziente(nome,cognome,cod_fisc)
def GetPersona(self,cod):
if cod not in self.persone:
raise ErrPersonaInesistente.ErrPersonaInesistente()
return self.persone[cod]
il main di prova è questo:
__author__="andrea"
__date__ ="$3-ott-2011 17.38.59$"
import Sanita
import Persona
if __name__ == "__main__":
# al fine di creare una Struttura sanitaria e' necessario utilizzare il metodo Sanita()
san=Sanita.Sanita()
#per caricare una persona e' necessario utilizzare il metodo AggiungiPersona()
nome="Paolo"
cognome="Verdi"
cod_fisc="asdfasdfasdfasdf"
san.AggiungiPersona(nome, cognome, cod_fisc)
nome="Mario"
cognome="Rossi"
cod_fisc="aaaaaaaaaaaaaaa4"
san.AggiungiPersona(nome, cognome, cod_fisc)
#si potra' avere accesso alla persona "creata" tramite il metodo GetPersona()
pers=san.GetPersona(cod_fisc)
cdimauro
11-10-2011, 07:30
Controlla i parametri di Persona.Paziente (potrebbero essere in ordine diverso :D) e togli le parentesi dal raise.
P.S. Posta l'archivio. :)
il costruttore di persona è cosi:class Paziente(Persona):
def __init__(self,nome,cognome,cod_fis):
self.nome=nome
self.cognome=cognome
self.cod_fisc=cod_fis
self.medico=""
l'eccezione nn necesista di () in quanto devo creare un istanza di tale eccezione?
il costruttore di persona è cosi:class Paziente(Persona):
def __init__(self,nome,cognome,cod_fis):
self.nome=nome
self.cognome=cognome
self.cod_fisc=cod_fis
self.medico=""
l'eccezione nn necesista di () in quanto devo creare un istanza di tale eccezione?
Quando devi creare un'istanza di un'eccezione ci vanno. Quindi probabilmente non la devi creare.
Non risolverà il tuo problema ma guardando quel costruttore noto che Paziente eredita da Persona, nel costruttore non puoi usare il costruttore di persona?
Edit: Probabilmente c'è un refuso hai scritto costruttore di Persona ma è di Paziente.
paziente dovrebbe essere l'interfaccia di persona... in questa esercitazione è richiesto (in modo esplicito ) di realizzare un interfaccia
cdimauro
12-10-2011, 21:30
Allora, ho trovato il problema. san.AggiungiPersona crea un'instanza di Paziente, ma lo inserisce nel dizionario pazienti, mentre nel main tu cerchi si visualizzare il valore del dizionario persone con quella chiave.
cdimauro
13-10-2011, 13:21
Hai creato un'istanza di Paziente, e l'hai giustamente inserita nel dizionario pazienti con una certa chiave.
L'errore ce l'hai perché vai a controllare quella chiave nel dizionario persone, che ovviamente è rimasto vuoto.
E' un errore di distrazione, insomma. Però ne commetti diversi. Dovresti starci attento, anche perché alcuni sono difficili da individuare, e richiedono tempo.
sono veramente id**** pensare che ho pure controllato -.- va bhe.... adesso gira "quasi" tutto non funzxiona la funzione di caricamento file (lancia l'eccezzione persona non trovata al 1 richiesta di quei dati) che ho riguardato ma mi pare corretta
Traceback (most recent call last):
File "C:\Users\andrea\workspace\netbeans\Lab5_sanita\src\main.py", line 68, in <module>
pers=san.GetPersona("RSSGNN33B30F316I")
File "C:\Users\andrea\workspace\netbeans\Lab5_sanita\src\Sanita.py", line 29, in GetPersona
raise ErrPersonaInesistente.ErrPersonaInesistente()
ErrPersonaInesistente.ErrPersonaInesistente
ho uppato i sorgenti xke la funzione in qeustione ha molte indentazioni e sul forum non si capirebbe niente causa "auto-a-capo"
poi ho un altro problemino...per come ho realizzato l'esercitazione i medici non potrannno mai essere seguiti da un altro medico (cosa richiesta dal testo) se io creo un ulteriore lista che chiamo persone(usando come chiave il codice fiscale) dove aggiungo sia medici che pazienti e uso quella per fare l'assegnazione medico-paziente dovrebbe andare no? anche python come in java lavora son riferimenti quindi modificando il riferimento vado a modificare l'istanza relativa vero?:D
cdimauro
14-10-2011, 07:24
Ho lanciato il main, ma mi dà lo stesso problema:
d:\tmp\Esercitazione>d:\PyWordCode\Python-3.2\PCbuild\python_d.exe Main.py
Traceback (most recent call last):
File "Main.py", line 19, in <module>
print(san.persone[cod_fisc].cognome)
KeyError: 'asdfasdfasdfasdf'
Sicuro che l'archivio fosse aggiornato?
chiedo scusa ma ho avuto alcuni problemi a casa (influenza dei miei genitori e quindi ho dovuto sostituirli a lavoro)
ecco l'archivio aggiornato
cdimauro
17-10-2011, 06:43
Mi spiace. Spero non sia niente di grave.
La procedura CaricaDati non era assolutamente "pythonica", per cui l'ho riscritta:
def CaricaDati(self,path):
import csv
Reader = csv.reader(open(path), delimiter=';')
for Row in Reader:
if Row:
Row = [Value.strip() for Value in Row]
if Row[0] == 'P':
self.AggiungiPersona(*Row[1 : ]) # Salta il primo elemento, e passa tutti gli altri come parametri.
elif Row[0] == 'M':
Codice = Row.pop(1) # Estrae il codice del medico
Row.insert(3, Codice) # Lo inserisce come penultimo elemento
self.AggiungiMedico(*Row[1 : ]) # Salta il primo elemento, e passa tutti gli altri come parametri.
Ho aggiunto qualche commento per spiegare alcuni passaggi che potevano risultare non chiari a un non pythonista. Ricordati di spostare import csv all'inizio del modulo, come si fa usualmente.
Comunque per far funzionare tutto ho dovuto cambiare una riga del main:
pers=san.GetPersona("VRDGPP76F09B666I")
Ho tolto lo spazio alla fine, insomma. Questo perché CaricaDati adesso si occupa di eliminare gli spazi all'inizio e alla fine di ogni campo letto, grazie alla seguente riga:
Row = [Value.strip() for Value in Row]
Ricordati di eliminare le () quando utilizzi raise per sollevare l'eccezione.
poi ho un altro problemino...per come ho realizzato l'esercitazione i medici non potrannno mai essere seguiti da un altro medico (cosa richiesta dal testo) se io creo un ulteriore lista che chiamo persone(usando come chiave il codice fiscale) dove aggiungo sia medici che pazienti e uso quella per fare l'assegnazione medico-paziente dovrebbe andare no?
Penso di sì.
anche python come in java lavora son riferimenti quindi modificando il riferimento vado a modificare l'istanza relativa vero?:D
Sì, solo riferimenti.
no niente di "grave" un po di influenza ma andare a lavorare cn la l'influenza non è cosa facile quindi li ho sostituiti:)
la procedura carica dati da te descritta è scritta con la versione 3.2 o devo mettermi a cambiare la sintassi?(adesso mi metto li e me la "studio")
la procedura di caricamento deve ignorare le righe con parametri errati quindi ad esempio con parametri mancanti come posso aggiungere questo controllo? (o è gia presente in modo implicito?)
cdimauro
17-10-2011, 13:35
no niente di "grave" un po di influenza ma andare a lavorare cn la l'influenza non è cosa facile quindi li ho sostituiti:)
Bene. :)
la procedura carica dati da te descritta è scritta con la versione 3.2 o devo mettermi a cambiare la sintassi?(adesso mi metto li e me la "studio")
Ormai il codice che riporto è sempre 3.2.
la procedura di caricamento deve ignorare le righe con parametri errati quindi ad esempio con parametri mancanti come posso aggiungere questo controllo? (o è gia presente in modo implicito?)
Non è presente, ma è facilmente implementabile. Basta cambiare i due if tenendo conto del numero di parametri che si aspettano. Ad esempio il primo sarebbe così:
if Row[0] == 'P' and len(Row) == 4
Mentre il secondo ha un valore in più.
e anche questa è finita adesso ne manca solo piu una :D che dovrebbe essere meno complessa dato che la parte "difficile" dovrebbe essere l'interfaccia grafica che non ho fatto e che penso vada bene comunque come cosa :D
mi metto a fare il main di prova di quest'ultima esercitazione.
grazie ancora
cdimauro
17-10-2011, 15:09
Mi fa molto piacere. Di meno il fatto che adesso dovrai implementare l'interfaccia grafica, dove non potrò darti una mano, se non a livello di conoscenza di Python e di esperienza come programmatore, perché non credo proprio che utilizzerai IronPython per tirarla sù, no? :P
in realtà non ho la minima idea di come farla...e spero che il prfessore me ne dispensi XD
cdimauro
17-10-2011, 15:41
Potresti proporgli IronPython + WPF, ad esempio. Le novità dovrebbero allettare i professori. ;)
gli ho inviato adesso le esercitazioni precedenti mentre finisco il main dell'ultima esercitazione (della parte pythonistica almeno) aspetto che risponda e in caso mi metto a farla come dici tu :D
e rieccomi qui nel frattempo il professore ovviamente nn ha risposto e io mi sono listato il mio prossimo pc (sono tutto contento xD) quindi mi sono giustamente piantato in un errore di sintassi nel metodo lencoSizeFile()
dove volevo ordinare i file non per chiave ma secondo il campo size
import FolderAlreadyExisting
class Folder(object):
'''
classdocs
'''
def __init__(self,nome):
'''
Constructor
'''
self.nome=nome
self.file={}
self.folder={}
self.father=None
def addFolder(self,new_folder):
if new_folder.nome in self.folder:
raise FolderAlreadyExisting
new_folder.father=self
self.folder[new_folder.nome]=new_folder
return
def getFather(self):
return self.father
def addFile(self,new_file):
self.file[new_file.getNome()]=new_file
return
def getFolder(self,lista):
if len(lista)==1:
return lista[0]
lista.remove(0)
if not lista:
return self.getFolder(lista)
return None
def getSubFolder(self,stringa):
n=stringa.split("/")
return self.getFolder(n)
def getFile(self,nome):
return self.file[nome]
def elencoAlfabeticoFile(self):
d=self.file.copy()
sorted(d)
return d
def elencoSizeFile(self):
d=self.file.copy()
sorted(d,key=lambda(k,v):(v,k))
return d
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.