|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#101 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ma solo a me da alla testa leggere cose del genere?
![]() Codice:
if __name__=="__main__":
unittest.main()
__________________
|
|
|
|
|
|
#102 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
io odio gli underscore qualunque sia il motivo per cui vengono usati
|
|
|
|
|
|
#103 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Dì la verità: usi il notepad per lavorare con Python, vero? P:S. Le variabili inizializzate da sole non mi piacciono: con quale valore dovrebbe essere fatto? Preferisco le ditine spezzate, così la prossima volta imparo a inizializzarle correttamente. P.P.S. Come sempre: de gustibus. Quote:
Esempio: posso usare dei mixin (apprò: mi sono fatto qualche giorno fa una comoda funzioncina per emularli, visto che Python non li supporta nativamente ).In C++ o in altri linguaggi non puoi "mettere in frigo" un costruttore, sostituirlo con un altro, e tirare fuori il vecchio quando ti fa comodo.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#104 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#105 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
non sarebbe meglio avere due costruttori diversi e chiamare quello più adeguato a seconda dei casi? oppure avere un solo costruttore che capisce da solo in che caso si trova?
|
|
|
|
|
|
|
#106 | ||||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Quote:
Quote:
Se prima sopportavo poco Python "a pelle", le ultime settimane che mi hanno costretto a lavorarci me lo hanno fatto sopportare sempre meno, ma con ottime motivazioni.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||||
|
|
|
|
|
#107 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quando scrivo a = b + c, b e c possono essere oggetti di qualunque tipo, e soltanto in fase di esecuzione "la matassa verrà sbrogliata". Cosa vuol dire questo? Che se nel codice mi ritrovo pattern di codice che posso utilizzare per tipi che non necessariamente debbono essere "compatibili", ma che funzionalmente devono funzionare allo stesso modo, nulla m'impedisce di racchiudere il tutto in una funzione / costruttore / operatore, magari "ereditati" tramite un apposito mixin. In soldoni: a me interessa modellare comportamenti. Questo con un linguaggio staticamente tipato non è assolutamente realizzabile (e in ogni caso non è fattibile: non posso ricavare il puntatore di un operatore, ad esempio). Quote:
Esempio. Io posso avere un modulo (ma anche una classe) chiamato Pippo con soltanto questa funzione: Codice:
def Prova(): print a Quindi sulla carta quel codice NON dovrebbe funzionare. Ma se scrivo questo: Codice:
import Pippo Pippo.a = 5 Pippo.Prova() E casi come questi ce ne sono diversi (esempio: con le metaclassi posso generare automaticamente classi abbiano determinati "requisiti", ivi compresi la definizione di attribuiti / metodi che sulla classe di partenza non esistevano). Dipende tutto da quel che si deve fare. La sintassi è corretta, e quando il sorgente viene compilato in bytecode, infatti, non viene generato nessun errore. Sull'uso di valori di default, rientriamo nelle convenzioni: quelli che proponi sono i valori più papali e che, quindi, possono "risolvere" la maggior parte dei casi, ma davanti a = b / c con c non definita si ritorna al punto di partenza, ossia l'errore che ho commesso è stato quello di non definire (correttamente) la variabile prima di averla usata. Tra l'altro l'uso di valori predefiniti porta a errori di mistyping difficilmente individuali (quando il codice, con un valore di default, non funziona lo stesso). Sugli editor/IDE nulla da dire, ma già in passato t'avevo avvisato di usarne qualcuno come SPE per evitare problemi come quelli dovuti all'indentazione necessaria in Python, ad esempio.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#108 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Sembra il Javascript, che tanto mi sta facendo penare in questo periodi perche' i problemi vengono fuori tutti a Runtime.
Peccato che per far partire l'applicazione e raggiungere il punto da testare ci si metta 40 secondi ogni volta, quando va bene. Codice:
// Pattern per la creazione di classe in javascript
function pippo()
{
}
//Decorator pattern per javascript
pippo.prototype.Prova = function()
{
alert(this.a);
}
//Usage
var pippoinstance=new pippo();
pippoinstance.a='Hello World';
pippoinstance.Prova();
Tutto dipende da cosa si e' lanciato, eseguito o distrutto prima di lanciare pippoinstance.Prova(); Non c'e' test che tenga. Il problema qui e' che this.a puo' assumere valore "Undefined", che non e' un valore vero e' proprio. Semplicemente e' lo stato che tiene conto del fatto che il campo non e' ancora stata dichiarata, e il tentativo di usarla genera un errore a runtime. Diverso e' avere il valore "NULL", ovvero quando la variabile assume il valore null, che e' un valore come un altro. In questo caso non c'e' errore a Runtime. Per fare le cose come si deve dovrei costringere tutte le funzioni a controllare l'esistenza di quanto usano, prima anche solo di valutarlo. A quel punto potrei usare i Pattern di Test, che altrimenti si arrabbierebbero subito. Pero' cosi' facendo il codice diventerebbe decisamente piu' lungo, lento e illeggibile. E' tanto piu' comodo essere "sicuri" che a Runtime la variabile di classe this.a esiste gia', perche' il compilatore ha gia' controllato tutto. Mannaggia a me che ho accettato di entrare in questo progetto che era stato disegnato da un altro e che si e' licenziato. (Non che avessi molta scelta, comunque) Dopo 5 mesi di lavoro su questo progetto la mia conclusione e' che il javascript non e' professionale. Non consco Python ma spero non soffra degli stessi problemi o che almeno abbia i mezzi per poterli gestire.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#109 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Il comportamento è lo stesso, ma hai i mezzi per controllare l'esistenza di "attributi" (con la funzione bult-in hasattr) prima di usarli, oppure puoi usare la libreria di sistema unittest per gestire agevolmente batterie di test (che risolverebbe il problema alla radice
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#110 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#111 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Fran, è un problema relativo a buona parte dei linguaggi "dinamici", Ruby compreso.
Lo si può risolvere in diversi modi, e uno fra questi è la TDD (sarebbe sufficiente coprire con un test ogni "biforcazione" del codice per avere la sicurezza di non essersi dimenticati di inizializzare correttamente tutte le variabili su cui lavora). ![]() Quanto al principio "Fail early, fail loud", se consideri che impieghi anche 1/10 del tempo a scrivere l'applicazione, vuol dire che puoi verificare molto prima se questa fallisce o meno coi dati reali. Diciamo che un linguaggio "tradizionale" ti permette di applicare (velocemente) il principio sulla base della correttezza "sintattica" del codice, mentre con uno "dinamico" lo applichi ai dati. Son cose diverse, ma l'obiettivo finale è arrivare alla correttezza dell'applicazione sulla base dei dati reali, e questo non viene a mancare.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#112 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Non ti ho fatto un esempio campato in aria: ho impiegato una giornata e mezza a scrivere tre righe di Python nel mondo reale su un progetto in produzione. Poter aggiungere metodi e proprieta' e' una cosa utile in certe situazione, ma doverla pagare sempre e comunque anche quando non mi serve e' un errore di progettazione.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#113 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non metto in dubbio che tu abbia perso tempo, ma i bug fanno parte della vita di un programmatore.
Quando ho cominciato a lavorare in Python, commettevo anch'io errori come quello, perché ero troppo abituato ai linguaggi "tradizionali" e al compilatore che ti segnalava l'assenza della dichiarazione di una variabile, perché è la sintassi stessa che lo richiede. Con Python non si tratta di una questione sintattica, ma prettamente semantica... Che sia grave non ci sono dubbi: infatti hai perso un bel po' di tempo per quella che ritieni una sciocchezza. Sciocchezze che, però, ritrovi anche in altri linguaggi che hanno una sintassi più "rigorosa": Codice:
int i; scanf("%d", i);
Non è un caso che siano nati tool come "lint", o PyCheck, e per linguaggi completamente diversi... Hai pagato un prezzo elevato per una sciochezza, ma per la mia esperienza il gioco vale la candela (ad esempio m'è capitato di realizzare un progetto in 20 giorni, quando lo stesso a un'altra società ha richiesto 6 mesi, e non so quanti c'abbiano lavorato), specialmente alla luce del fatto che una volta pronta l'applicazione la posso immediatamente testare con dati reali e rilevare, quindi, anche errori come quello che ti sono capitati. Comunque questo http://cobra-language.com/ linguaggio che ha segnalato un utente qualche giorno fa è molto simile a Python, ma non ha i problemi di cui ti lamenti (unica eccezione, l'indentazione). Ecco qui http://cobra-language.com/docs/python/ un confronto con Python.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#114 | ||||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
E' vero, ma strumenti migliori migliorano anche la vita. Python, per colpe di chi lo ha progettato si e' rivelato per me uno strumento peggiore su un progetto di grandi dimensioni. Visto che gli errori alla guida fanno parte della vita, andiamo tutti in giro con una macchina con una ruota sgonfia E cerchiamo di convincere gli altri che sia La Cosa Migliore Possibile (tm). Quote:
Quote:
Il parallelo di quello che e' successo a me lo fai con questo codice: Codice:
scanf("%d", i);
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||||
|
|
|
|
|
#115 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non sto cambiando le carte in tavola, lo sai che non sono il tipo, Fran.
scanf non dà nessun errore sintattico, il codice viene compilato, e dio solo sa se e quando riuscirai a scoprire che mancava un & per passare il puntatore alla variabile anziché il suo valore. In ogni caso lo scopriresti a runtime. E tutto perché? Perché il C come linguaggio non supporta il passaggio per riferimento e passa tutto per valore (in ogni caso, anche se l'avesse avuto, con funzioni che accettano un numero di argomenti variabile, come scanf appunto, il problema sarebbe rimasto ugualmente). E' sicuramente colpa di chi l'ha progettato, che ha trasformato un errore sintattico (che linguaggi come il Pascal risolvono con l'uso della keyword VAR nella definizione dell'elenco dei parametri di una procedura/funzione) in uno semantico... Sono d'accordo sull'uso degli strumenti migliori: lint per il C che ti fa scoprire quell'errore (semantico) con la scanf, e PyChecker per Python che fa saltare fuori la mancata dichiarazione di una variabile (meglio ancora SPE, che ha tutto integrato nell'IDE: Ctrl-Alt-C e il sorgente viene controllato semanticamente, oltre al controllo sintattico che di suo quest'IDE esegue in tempo reale mentre si sta scrivendo il codice). Oggi come programmatori non possiamo affidarci esclusivamente al linguaggio, che è soltanto uno strumento: abbiamo la necessità di circondarci di diversi strumenti che concorrono a vario titolo alla produzione del codice finale. Non riesco a immaginare di lavorare in Java senza i comodi strumenti che IDE come Eclipse mettono a disposizione (tanto per fare un esempio con un linguaggio diverso da C e Python): la mia produttività ne risentirebbe sicuramente.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#116 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Codice:
something = object.m_Member; Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#117 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non avevo capito che ti riferissi al problema che hai avuto.
Ho soltanto portato un esempio di un costrutto sintatticamente corretto in C, ma che a livello semantico genera problemi. Tutto qui.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#118 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Il mio discorso si basa sul fatto che una cosa fondamentale come la presenza di una variable in un oggetto (dal quale non ho bisogno alcun comportamento dinamico) non sia validata a tempo di compilazione. Figurati che voglio usare un qualche tool che me la validi mentre scrivo il codice, per questo preferisco C#/Java a C++. Mentre Python mi impone come design del linguaggio di pagare il prezzo di un oggetto dinamico anche quando questa feature non mi serve. Dai un'occhiata a Corba, non derivasse da Python sarebbe un gran linguaggio A parte gli scherzi, unit testing e design by contract direttamente nel linguaggio, compila per .NET, sintassi pulita, forse un po' troppy Python-like (indentazione... grrrr), tipizzazione statica o dinamica a scelta. E' un linguaggio con un design chiaramente superiore a Python.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#119 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Proprio per questo l'ho segnalato.
Ha certi aspetti come lo unit testing e il design-by-contract che mi affascinano da sempre (anche la scelta fra tipizzazione statica o dinamica è interessante, ma poi ho visto gli esempi coi generic e mi sono cadute le braccia: è troppo comodo avere un tipo "generico" e... usarlo subito, come faccio adesso). Vedremo come si evolverà, perché promette bene. Un'altra cosa che forse non hai notato è che non richiede l'indicazione di self come primo parametro nella definizione dei metodi e, per accedere alle variabili di istanza (o di classe, se non ricordo male) è sufficiente premettere il punto (es: .x = 0); e... non usa i due punti alla fine di un costrutto di definizione o controllo. Mi sa che l'unica cosa che ti farà desistere dal provarlo rimane l'indentazione forzata...
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#120 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Ma mi sembra molto acerbo, non c'e' integrazione con VS2005/2008 e non ho capito come creare un oggetto da consumare in .NET. Appena mi sistemano queste due cosette lo provo piu' seriamente. DbC e Unit Testing nel linguaggio mi intrigano moltissimo.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:34.













non sarebbe meglio avere due costruttori diversi e chiamare quello più adeguato a seconda dei casi? oppure avere un solo costruttore che capisce da solo in che caso si trova?









