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