On Wed, Feb 17 2016, Giuseppe Costanzi wrote: > 2016-02-17 22:22 GMT+01:00 Dario Santomarco <dario.santoma...@gmail.com>: > > Il 17/02/2016 19.59, Giuseppe Costanzi ha scritto: > > > > salve a tutti, > > non riesco a capire come usare *args, **kwargs in una classe. > > mi sono fatto uno script che riporto sotto ma, ad esempio mi perdo > > kwargs per strada mentre gli args proprio non li vedo da dentro la classe. > > lo script sotto mi ritorna > > > > bc@hal9000 > > :~/stimuli$ python super.py > > MRO: ['B', 'A', 'object'] > > __init__ class B: ({1: 'A', 2: 'B', 3: 'C'},) {} > > __init__ class A: ({1: 'A', 2: 'B', 3: 'C'},) {} > > super class B: ({1: 'A', 2: 'B', 3: 'C'},) {} > > class: B > > kwargs : {} > > end > > > > che non ho capito? > > > > import sys > > > > class A(object): > > def __init__(self,*args, **kwargs): > > print "__init__ class A: %s %s"%(args,kwargs) > > > > class B(A): > > def __init__(self,arg, *args, **kwargs): > > print "__init__ class B: %s %s" %(args, kwargs) > > super(B, self).__init__(*args, **kwargs) > > print "super class B: %s %s" %(args, kwargs) > > > > self.kwargs = kwargs > > > > > > def __str__(self): > > return "class: %s\nkwargs : %s" % (self.__class__.__name__, > > self.kwargs,) > > > > def main(): > > > > print "MRO:", [x.__name__ for x in B.__mro__] > > > > > > args = ('Y','Y','Z') > > kwargs = {1:"A", 2:"B", 3:"C"} > > > > foo = B(args, kwargs) > > > > print foo > > > > raw_input('end') > > > > if __name__ == "__main__": > > main() > > _______________________________________________ > > Python mailing list > > Python@lists.python.it > > http://lists.python.it/mailman/listinfo/python > > > > Ciao, ci sono i seguenti errori: > > Tua - kwargs = {1:"A", 2:"B", 3:"C"} > > Corretta - kwargs = {'1':"A", '2':"B", '3':"C"} # le chiavi del > > dizionario DEVONO essere stringhe > > > > Per le altre due ci sono due opzioni > > Questa ha più senso: > > Tua - def __init__(self,arg, *args, **kwargs): #quel arg sembra > > un errore di battitura, non ha molto senso in quella posizione > > Corretta -def __init__(self, *args, **kwargs): > > > > Tua - foo = B(args, kwargs) > > Tua - foo = B(args, **kwargs) # se glielo passi senza i doppi > > asterischi gli stai passando un oggetto dict che va a finire come lista di > > argomenti catturata da *args, devi spacchettarlo con ** > > > > Questa ha meno senso: > > Tua - def __init__(self,arg, *args, **kwargs): #supponendo ci > > siano motivi particolari per cui vuoi tenere il tutto com'è > > > > Tua - foo = B(args, kwargs) > > Corretta - foo = B(*args, **kwargs) # devi spacchettare args > > altrimenti viene catturata da arg come oggetto tupla. spacchettandola accade > > che la prima 'Y' va ad arg e le restanti due lettere ad *args > > -- > > > > Dario Santomarco > > ho capito...grazie... > > args = ('Y','Y','Z') > kwargs = {'server':"127.0.0.1", > 'user':"guest",'passw':"12345",'database':"genbank"} > > foo = B(args, **kwargs) > > bc@hal9000:~/stimuli$ python super.py > MRO: ['B', 'A', 'object'] > __init__ class B: (('Y', 'Y', 'Z'),) {'passw': '12345', 'user': > 'guest', 'server': '127.0.0.1', 'database': 'genbank'} > __init__ class A: (('Y', 'Y', 'Z'),) {'database': 'genbank', 'passw': > '12345', 'user': 'guest', 'server': '127.0.0.1'} > super class B: (('Y', 'Y', 'Z'),) {'passw': '12345', 'user': 'guest', > 'server': '127.0.0.1', 'database': 'genbank'} > class: B > kwargs : {'passw': '12345', 'user': 'guest', 'server': '127.0.0.1', > 'database': 'genbank'} > end > > che e' quello che voglio > grazie a tutti per la pazienza :(
Sei sicuro? al 100%? Hai controllato bene cosa è args in __init__? Una tupla con un solo elemento che è una tupla di tre elementi. Le due scritture non sono uguali: >>> ('Y','Y','Z') != (('Y', 'Y', 'Z'),) True m. _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python