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

Rispondere a