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 :( > _______________________________________________ > Python mailing list > Python@lists.python.it > http://lists.python.it/mailman/listinfo/python > _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python