Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Es3 classe Attore

T
Tommaso (1480 points)
3 8 22
in Es3 by (1.5k points)

Ho un problema sulla classe Attore, in particolare sui test di creazione degli Attori (verifica che gli attori abbiano correttamente settati i dati base). L'errore che il test riporta è "TypeError: 'list' object is not callable". Penso che il problema sia nell'init della classe Attore: io setto tutti i parametri nome, genere, età e vero nome prendendoli dall'oggetto data in input all'init. In particolare per l'età la calcolo con un metodo ad hoc sempre all'interno dell'int. Secondo voi sbaglio qualcosa?

1.0k views

1 Answer

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Sicuramente è lo stesso problema di "int object is not callable" e "str object is not callable". Hai definito un attributo (variabile di classe) e un metodo (funzione di classe) con lo stesso nome, e in particolare l'attributo è una lista. Quindi quando chiami il metodo, python pensa che stai chiamando l'attributo, ma come fosse una funzione, solo che è impossibile e quindi ti dice che non è callable, cioè non puoi chiamarlo come fosse una funzione (cioè con le parentesi)
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
Non so sinceramente se il problema sia quello. Nel senso che ho controllato se chiamo attributi o metodi in maniera uguale ma non mi sembra

self = <test_03.Test testMethod=test_10_new_Attore_1___Marilyn_Monroe___37___F____Norma_Jeane_Mortenson__>
attore = <program03.Attore object at 0x000001E8180FA828>
nome = 'Marilyn Monroe', eta = 37, genere = 'F'
truename = 'Norma Jeane Mortenson'

    def do_test_Attore_dati_base(self, attore, nome, eta, genere, truename):
        '''Verifica che l'attore contenga i dati base'''
        self.assertEqual(type(attore),      Attore,     "Non è una istanza di Attore")
>       self.assertEqual(attore.nome(),     nome,       f"Il nome dell'attore non è {nome}")
E       TypeError: 'list' object is not callable

test_03.py:127: TypeError
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Attore.nome è un attributo credo
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

si è un attributo della classe Attore il nome ma non ho nessun metodo che si chiama anche nome.

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Non puoi non avere un metodo che si chiama nome, il metodo Attore.nome è predefinito e viene richiesto dall'esercizio, sicuramente l'hai cancellato. Senza quello non può funzionare l'esercizio
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

Sì scusami avevo capito male, nella classe Attore ho il metodo nome ma non ne ho creato nessuno nuovo che si chiama anche nome. 

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Allora forse dentro il metodo nome ne chiami uno che ha questo problema. Insomma, da qualche parte l'errore è quello, te l'assicuro. Hanno già chiesto almeno 4 volte questa cosa, basta che cerchi "callable" e ti escono le domande già fatte su questo argomento, tutte quante avevano il problema che ho detto
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

Ok letto anche gli altri post che mi hai consigliato, in effetti sembra proprio quello il problema. Ho modificato all'interno dell'init di attore il nome per il self in modo da avere ad esempio self._nome (l'undescore per evitare il problema di omonimia) idem per il ritorno dentro al metodo nome di Attore, pure qui passo direttamente il return come un self._nome. Ma il problema rimane lo stesso. Non vorrei a questo punto che il problema non sia su nome ma su un altro attributo.

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Può essere che durante alcuni test, un metodo di attore richiama un altro metodo/attributo che genera quell'errore. Crea alcune istanze di prova nella console usando i dizionari del json o inventateli tu, e vedi se chiamando alcuni metodi a caso succede quella cosa
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

Sì a questo punto penso sia quello il problema. Come test ho creato un dizionario del json di prova:

dictAttore= {'NAME': ['Baby Paul Cullen'], 'LASTFIRST': ['Cullen, Baby Paul'], 'REALNAME': ['Paul Michael Cullen'], 'NICKNAMES': [], 'GENDER': ['M'], 'BIRTH': ['1962, Ireland'], 'DIED': ['21 July 2009, Los Angeles, California, USA']}
 

test_= Attore(dictAttore)

In test_ ho correttamente valorizzato tutti gli attributi dell'attore, ad esempio, facendo una print:

print(test_.nome)

ottengo in console:

Baby Paul Cullen

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Prova gli altri metodi
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

provati tutti nel main, rispondono tutti, nel senso che ho provato sia un print di self._nome (attributo) sia di self.nome() (metodo) caricando un json di test inventato da me e rispondono entrambi.

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ma ora che hai cambiato nome ti dà ancora l'errore?
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
Sì Andrea per quello che mi pare strano
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ma sei sicuro che l'errore sia sempre lo stesso e sempre alla stessa riga?
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
Eh sì, stesso identico errore di prima....

self = <test_03.Test testMethod=test_10_new_Attore_1___Marilyn_Monroe___37___F____Norma_Jeane_Mortenson__>
attore = <program03.Attore object at 0x000002371F7935F8>
nome = 'Marilyn Monroe', eta = 37, genere = 'F'
truename = 'Norma Jeane Mortenson'

    def do_test_Attore_dati_base(self, attore, nome, eta, genere, truename):
        '''Verifica che l'attore contenga i dati base'''
        self.assertEqual(type(attore),      Attore,     "Non è una istanza di Attore")
>       self.assertEqual(attore.nome(),     nome,       f"Il nome dell'attore non è {nome}")
E       TypeError: 'list' object is not callable

test_03.py:127: TypeError
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ma in che formato salvi il nome? Lo tieni in una lista come nel dizionario? Dovresti ritornare una stringa
T
Tommaso (1480 points)
3 8 22
by (1.5k points)

No è una stringa, infatti non capisco neanche perchè mi dice 'list' nel messaggio dell'errore. Ti dirò di più nell'init di Attore setto solamente i self._xxxx a valori direttamente, come se fossero di default e basta, neanche utilizzo il parametro data in input all'init.

_andrea_ (45670 points)
13 42 297
by (45.7k points)
Come fai a settarli e basta? Devi per forza usare il data altrimenti dove li trovi il nome, la nascita ecc?
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
No dicevo solamente per fare un test... per capire l'errore. Ho settato i vari self.variabile='xxx' tranne l'età che è un intero self.eta=12
_andrea_ (45670 points)
13 42 297
by (45.7k points)
E hai lanciato il tester così?
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
Sì, lo scopo era solo capire se l'errore cambiava. Nell'init praticamente così facendo avevo dei semplici valori di default settati, mentre i vari metodi della classe ritornava i valori di vari self. Così facendo al massimo non doveva passare il test ma non doveva andare in errore typerror
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Ma come fa ad arrivarti a quel test se i valori li assegni tutti uguali?
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
infatti passa i primi tre test, poi il terzo test è quello che va in errore. Va in errore proprio quello in cui crea un oggetto Attore settandogli gli attributi. Lo scopo non è passare il terzo test era solo quello di capire se quell'errore cambiava
_andrea_ (45670 points)
13 42 297
by (45.7k points)
Non so, vedi tutto quello che assegni perché da qualche parte sicuramente hai una lista di troppo
T
Tommaso (1480 points)
3 8 22
by (1.5k points)
Sì forse mi conviene ripartire dalla semplice lettura dei json e ricostruire piano piano le altre classi per capire il problema. Grazie mille.