HW3-bis es3 Creazione catalogo_personaggi e Classe Personaggio

f.cocci (650 points)
1 13 17
asked Apr 3, 2019 in HW3bis by f.cocci (650 points)
Salve, relativamente all'es3 dell'HW3-BIS, vorreti capire come comportarmi dopo aver letto il file json.

Se ho capito bene deve creare un catalogo_personaggi che contiene istanze univoche di ciascun personaggio.

abbiamo piu' characterName all'interno di json, come devo comportarmi?

Tra gli attributi che deve possedere la classe Personaggio() ci sono quelli contrassegnati con " * ".

Gli attributi con un asterisco sono liste di riferimenti ad altre
istanze di classe Personaggio corrispondenti ai personaggi cui la voce
del dizionario fa riferimento: non capisco, ad esempio per l'attributo actorName, quale dovrebbe essere il riferimento, non esiste una oggetto tipo Personaggio() che sia un attore...

Forse vuol dire se abbiamo piu' characterName con lo stesso nome, allora gli attributi con asterisco possono riferirsi a due dizionari distinti letti da json.

il concetto di come gestire il catalogo_casate mi sembra + chiaro.

Grazie in anticipo, F.
511 views

1 Answer

Best answer
M
MatteoDante (620 points)
0 3 5
answered Apr 3, 2019 by MatteoDante (620 points)
selected Apr 3, 2019 by f.cocci
L'attributo actorName non deve far riferimento ad un altro personaggio, c'è un errore di battitura, dovrebbe essere come il nickname quindi deve essere un valore stringa, mentre per gli altri attributi che fanno riferimento a personaggio va indicata l'instanza della classe personaggio a cui fa riferimento.
f.cocci (650 points)
1 13 17
commented Apr 3, 2019 by f.cocci (650 points)
Ok, buono a sapersi allora, esiste per caso qualcosa di ufficiale scritto da profs.

Senti, ma quindi dato il file json, che contiene come valore della chiave characters la lista i cui elementi sono i dizionari con le informazioni di ciascun attore, posso istanziare un oggetto Personaggio() per ognuno di loro:

Ad esempio, il characterName = "White Walker" compare 3 volte con attribuiti diversi, e o in piu'. Sono istanze diverse oppure un'unica istanza?
M
MatteoDante (620 points)
0 3 5
commented Apr 3, 2019 by MatteoDante (620 points)
Si avevo trovato una discussione dove veniva detto, se cerchi un po' la trovi sotto il tag hw3bis.
Comunque ti posso dire come ho fatto io, ho istanziato un oggetto per ogni dizionario relativo al personaggio stando attendo a creare anche la lista di oggetti casate. Poi puoi iterare anche una seconda volta per complementare altri dati che non puoi prendere a primo ciclo (almeno io non ho trovato il modo) spero di esserti stato utile
f.cocci (650 points)
1 13 17
commented Apr 3, 2019 by f.cocci (650 points)
Penso di aver capito, purtroppo quel dubbio mi ha fatto perdere un sacco di tempo.

Ti ringrazio ancora, F.
andrea.sterbini (172780 points)
513 935 1789
commented Apr 3, 2019 by andrea.sterbini (172,780 points)
Sento Spognardi che ha scritto l'esercizio e vi faccio sapere
angelo.spognardi (4680 points)
37 62 96
commented Apr 4, 2019 by angelo.spognardi (4,680 points)
Si, ci sono diversi esempi di personaggi minori, senza casata, che hanno lo stesso charactername e diversi actors: in quel caso basta che ci sia almeno un personaggio con quel charactername, NON dovete creare più characters con lo stesso name nel catalogo. Il suggerimento di MatteoDante è corretto e ti consiglio di seguirlo.
f.cocci (650 points)
1 13 17
commented Apr 4, 2019 by f.cocci (650 points)

Grazie del feedback prof. Spognardi.

Non sono ancora convinto di una cosa:

Di seguito un esempio di dizionari con stesso characterName:

{
         "characterName":"White Walker",
         "characterImageThumb":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1._SX100_SY140_.jpg",
         "characterImageFull":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1_.jpg",
         "characterLink":"/character/ch0304921/",
         "actorName":"Ian Whyte",
         "actorLink":"/name/nm1613839/"
      },
      {
         "characterName":"White Walker",
         "characterImageThumb":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1._SX100_SY140_.jpg",
         "characterImageFull":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1_.jpg",
         "characterLink":"/character/ch0304921/",
         "actorName":"Ross Mullan",
         "actorLink":"/name/nm1368643/",
         "killedBy":"Samwell Tarly"
      },
      {
         "characterName":"White Walker",
         "characterImageThumb":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1._SX100_SY140_.jpg",
         "characterImageFull":"https://images-na.ssl-images-amazon.com/images/M/MV5BMjYzNDMyZWUtMDVlMy00OGQxLWFkZTctOWMxZDk1MDA5MmQzXkEyXkFqcGdeQXVyMjk3NTUyOTc@._V1_.jpg",
         "characterLink":"/character/ch0304921/",
         "actorName":"Tim Loane",
         "actorLink":"/name/nm0516385/",
         "killedBy":"Jon Snow",
         "killed":"Loboda"
      }

I tre personaggi minori in effetti non hanno casata, per questo suppongo li definiamo "minori".

Non mi e' chiaro quale scegliere dei tre.

Hanno tre attori differenti, e differenze anche tra attributi "uccisi" ed "ucciso da", quindi di fatto sono personaggi diversi con lo stesso charterName.

Siccome mi dice che devo sceglierne uno dei tre, e che necessariamente non possono esistere nel catalogo_personaggi piu' istanze Personaggio() con lo stesso characterName, volevo sapere se la scelta del personaggio da istanziare e':

  1. Casuale-->ad esempio becco il primo e continuo con lo spulciare i restanti dizionari con differenti characterName
  2. Definica-->se c'e' una qualche logica dietro da rispettare affinche il catalogo_personaggi sia consistente per trovare le successive relazioni.

Matteo, si e' mosso invece istanziano un oggetto per ciascun dizionario, non considerando il characterName.

Grazie, F.
M
MatteoDante (620 points)
0 3 5
commented Apr 4, 2019 by MatteoDante (620 points)

Si ho considerato il characterName, ma non mi sono accorto di questi 3 personaggi uguali, interrogando ora il mio dizionario personaggi ho scoperto che il mio 'White Walker' è il terzo che hai citato perchè ho sempre sovrascritto il personaggio che c'era. Comunque nei test non vengono chiesti questi personaggi che possono dare problemi, io ho anche trovato dei riferimenti nelle sezioni "killedBy" o "marriedEngaged" o altri che erano personaggi non contenuti nel json, ho risolto, o forse meglio dire ho passato i test semplicemente ignorando con un try

f.cocci (650 points)
1 13 17
commented Apr 4, 2019 by f.cocci (650 points)
Okay, aspettando anche un feedback dal prof, io cmq ti ringrazio perche almeno sto iniziando a pestare con piu' serenita'.

Penso che tanto alla fine in questo tipo di esercizio, non si possono passare tutti i test di botto, ma che alla prima trance, occorre fare del tuning per rendere il codice compliant e farglieli superare pian pianino tutti quanti.

Grazie di tutto, F.
angelo.spognardi (4680 points)
37 62 96
commented Apr 4, 2019 by angelo.spognardi (4,680 points)
Si, vanno bene entrambe le interpretazioni: ai fini dell'esercizio, non c'è  preferenza fra i tre diversi personaggi. L'importante è l'univocità dei personaggi e la correttezza dei link fra i vari oggetti.
f.cocci (650 points)
1 13 17
commented Apr 4, 2019 by f.cocci (650 points)
Perfetto, grazie 1000 prof. Spognardi.

Un saluto, F.
f.cocci (650 points)
1 13 17
commented Apr 4, 2019 by f.cocci (650 points)
edited Apr 4, 2019 by f.cocci
Ho un'altro dubbio.

il costruttore della classe personaggio deve valorizzare tutti gli attributi "possibli": significa che se sono presenti nel dizionario devono essere inizializzati, corretto?

Veniamo alle famose liste di riferimenti ad altre istanze Personaggio().

Per farlo, ovviamente occorre fare una seconda passata nel senso che non posso avere un riferimento ad una classe esistente se non e' stata gia costruita, corretto.

Sto pensando quindi di valorizzare inizialmente questi attributi come liste di strighe.

E poi una volta costituiti i cataloghi con tutte le istanze di casate e personaggi andare a capire se quel riferimento == ad un oggetto Personaggio().name e in quel caso sostituirli con l'istanza stessa.

Ci sono altri metodi piu' furbi, oppure in un mdo o nell'atro la strategia e' step by step.

################

Inoltre mi chiedevo, se per caso come attributo dovesse essere inizializzato anche "parentOf". La traccia parla solo di genitori quindi "parents" ma a me sembra importante anche "genitoreDi".

Grazie ancora, F.
angelo.spognardi (4680 points)
37 62 96
commented Apr 4, 2019 by angelo.spognardi (4,680 points)
Esatto, tutti gli attributi "possibli", ma comunque presenti nella classe Personaggio.

Come hai ben detto non puoi avere un riferimento ad una classe inesistente, quindi... O riscorri la lista usando le stringhe dei personaggi (che mi sembra una valida soluzione), oppure, come alternativa, potresti mantienere una lista di tutti i riferimenti che poi dovrai andare a riempire con l'opportuno riferimento, una volta che una istanza è stata creata, ma... Ne vale la pena? Quanto risparmi? Ma soprattutto: risparmi? Boh. Un'altra idea potrebbe essere che organizzi il programma per fare una creazione greedy: quando durante la creazione di un personaggio devi riempire un attributo con un'altra istanza di personaggio, se ce l'hai, la riempi, se non ce l'hai sospendi e ricorsivamente crei l'istanza per quell'attributo. Ma per farlo, devi prima organizzarti in modo da accedere agli elementi del json in maniera strutturata. Di nuovo: ne vale la pena? Boh.

Gli attributi della classe Personaggio sono quelli della traccia. Se ne vuoi aggiungere altri, non è un errore, ma non sono considerati ai fini dell'esercizio.
f.cocci (650 points)
1 13 17
commented Apr 4, 2019 by f.cocci (650 points)
Grazie Prof, infatti stavo pensando anche io ad un approccio di tipo ricorsivo, ma mi sono deciso a scrivere appunto perche' sebbene figo come approccio, non ero certo che vallesse la pena.

Fare delle passate successive sfruttando i riferimenti di tipo stringa per poi succesivamente sostituirli con l'istanza del relativo personaggio mi sembra piu' semplice.

Ancora grazie :-)
f.cocci (650 points)
1 13 17
commented Apr 5, 2019 by f.cocci (650 points)

Profs, siamo in conclusione. un altro dubbietto: ma se in uno degli attributi della classe Personaggio() di tipo lista, la stringa non divesse fare riferimento ad un altra istanza di tipo Personagio(), come ci comportiamo:

  1. lasciamo l'elemento in formato stringa oppure
  2. lo dobbiamo eliminare, ne l caso sia richiesto che le liste debbano contenere esclusivamente riferimenti ad altre istanze.
Grazie, F.
angelo.spognardi (4680 points)
37 62 96
commented Apr 5, 2019 by angelo.spognardi (4,680 points)
Uh, mi risulta una situazione anomala: esistono casi simili? Mi pareva che le relazioni delle liste di personaggi formassero un insieme "chiuso". Potresti fare qualche esempio reale?
f.cocci (650 points)
1 13 17
commented Apr 5, 2019 by f.cocci (650 points)
E' il caso di "Bolton Soldier"

Non esiste un characterName corrispondente quindi non l'ho istanziato.

{
         "characterName":"Podrick Payne",
         "characterImageThumb":"https://images-na.ssl-images-amazon.com/images/M/MV5BNTU5NjczOTQyNl5BMl5BanBnXkFtZTcwMzMwNTk4OQ@@._V1._SX100_SY140_.jpg",
         "characterImageFull":"https://images-na.ssl-images-amazon.com/images/M/MV5BNTU5NjczOTQyNl5BMl5BanBnXkFtZTcwMzMwNTk4OQ@@._V1_.jpg",
         "characterLink":"/character/ch0306046/",
         "actorName":"Daniel Portman",
         "actorLink":"/name/nm4535552/",
         "killed":[
            "Mandon Moore",
            "Bolton Soldier"
f.cocci (650 points)
1 13 17
commented Apr 5, 2019 by f.cocci (650 points)
aggiungo che al momento la presenza nelle liste di questi nonRiferimenti non mi sta creando problemi.

Ran 50 tests in 0.114s

FAILED (failures=2)
48 test passed, 2 tests failed

Mancano le ultime due funzioni a cui si riferiscono i 2 FAILED
angelo.spognardi (4680 points)
37 62 96
commented Apr 5, 2019 by angelo.spognardi (4,680 points)
Chiaro. Il soldato Bolton non aveva scampo. È corretto che rimanga una stringa nella lista. Ben fatto.
f.cocci (650 points)
1 13 17
commented Apr 5, 2019 by f.cocci (650 points)
Grazie a lei prof e' stato gentilissimo a starmi dietro in tutte le mie fisme :-)

Un saluto, F
f.cocci (650 points)
1 13 17
commented Apr 6, 2019 by f.cocci (650 points)
Prof, questa volta e' l'ultima, sono all'ultimo test "dynisty".

la mia funzione ritorna "Sansa Stark" che e' cio' che si aspetta il test.

L'unica cosa e' che l'insime contiene un numero leggermente superiore.

A me ne torna 56 != 52 (expected).

Di seguiti il dettaglio dei personaggi che mi ritrovo in piu'.

{'Brynden Tully', 'Edmure Tully', 'Hoster Tully', 'Lysa Arryn'}

La cosa che piu' non mi convince pero' e' che per arrivara a questo risultato ho dovuto rimuovere dall'insieme della famiglia allargata prodotto dal metodo famiglia_allargata() i parenti diretti del o dei partner. quindi di fatto la famiglia allargata in questo momento contiene tutti le parentele dirette del personaggio (genitori, figli, fratelli,partner), piu' tutti i membri della casata di ciascun personaggio.

Passano sempre tutti i test tranne dynisty.

Ancora grazie, F.
f.cocci (650 points)
1 13 17
commented Apr 6, 2019 by f.cocci (650 points)
Prof, avrei risolto in questa maniera.

Quando calcolavo la famiglia allargata, oltre che verificare le parelntele dirette ed eventuali parentele dirette del o dei partner, a questo insieme aggiungevo la parentela allargata andando per ciascun personaggio del primo insime a ricercare i membri delle rispettive casate.

anzicche farlo per ogni personaggio ho aggiunto solo i membri delle casate a cui appartiene l'oggetto self, e i membri della casata a cui appartine il o i partner.

Infatti i Tully appartenevano alla casata Tully del parent di Sansa Stark, che addirittura ne aveva 2 di casate.

A ogni modo i test li passa, spero non sia un caso o una forzatura.

Grazie, F.