[Python] super(MyClass, self).__init__(*args, **kwargs)

Giuseppe Costanzi giuseppecostanzi a gmail.com
Mer 17 Feb 2016 22:42:07 CET


2016-02-17 21:48 GMT+01:00 Christian Barra <barrachri a gmail.com>:
> def __init__(self,arg, *args, **kwargs):
>
> args = ('Y','Y','Z')
> kwargs = {1:"A", 2:"B", 3:"C"}
>
> foo = B(args, kwargs,msg="Hello")
>
> Cosa ti fa pensare che la lista (args immagino) si sia persa ?
>
> La domanda e' tu dove ti aspetti di trovarla :)
>
> args -> arg
> kwargs -> *args
> msg="Hello" -> **kwargs
>
> --
>
> I wish you a good day,
> Christian

ok quell' args mi è scappato e levandolo
ottengo

bc a hal9000:~/stimuli$ python super.py
MRO: ['B', 'A', 'object']
__init__ class B: (('Y', 'Y', 'Z'), {1: 'A', 2: 'B', 3: 'C'}) {'msg': 'Hello'}
__init__ class A: (('Y', 'Y', 'Z'), {1: 'A', 2: 'B', 3: 'C'}) {'msg': 'Hello'}
super class B: (('Y', 'Y', 'Z'), {1: 'A', 2: 'B', 3: 'C'}) {'msg': 'Hello'}
class: B
kwargs : {'msg': 'Hello'}
end

quello che non riesco a capire e' perchè se la classe
mi accetta valori arbitrari di una lista e di un dizionario
ed io , mi sembra, li passo con args e kwargs
l' *args si pappa lista e dizionario e per popolare **kwargs
devo passargli un'altro parametro (msg': 'Hello')
cioè non posso passare a *kwargs un dizionario e
poi spacchettarmenlo da dentro la classe?

per fare un esempio pratico

args = ('Y','Y','Z')
kwargs = {'server':"127.0.0.1",
'user':"guest",'passw':"12345",'database':"genbank"}

foo = B(args, kwargs, server="127.0.0.1",
user="guest",passw="12345",database="genbank")

ritorna

bc a hal9000:~/stimuli$ python super.py
MRO: ['B', 'A', 'object']
__init__ class B: (('Y', 'Y', 'Z'), {'database': 'genbank', 'passw':
'12345', 'user': 'guest', 'server': '127.0.0.1'}) {'database':
'genbank', 'passw': '12345', 'user': 'guest', 'server': '127.0.0.1'}
__init__ class A: (('Y', 'Y', 'Z'), {'database': 'genbank', 'passw':
'12345', 'user': 'guest', 'server': '127.0.0.1'}) {'passw': '12345',
'user': 'guest', 'server': '127.0.0.1', 'database': 'genbank'}
super class B: (('Y', 'Y', 'Z'), {'database': 'genbank', 'passw':
'12345', 'user': 'guest', 'server': '127.0.0.1'}) {'database':
'genbank', 'passw': '12345', 'user': 'guest', 'server': '127.0.0.1'}
class: B
kwargs : {'database': 'genbank', 'passw': '12345', 'user': 'guest',
'server': '127.0.0.1'}
end

mentre

args = ('Y','Y','Z')
foo = B(args, server="127.0.0.1", user="guest",passw="12345",database="genbank")



bc a hal9000:~/stimuli$ python super.py
MRO: ['B', 'A', 'object']
__init__ class B: (('Y', 'Y', 'Z'),) {'database': 'genbank', 'passw':
'12345', 'user': 'guest', 'server': '127.0.0.1'}
__init__ class A: (('Y', 'Y', 'Z'),) {'passw': '12345', 'user':
'guest', 'server': '127.0.0.1', 'database': 'genbank'}
super class B: (('Y', 'Y', 'Z'),) {'database': 'genbank', 'passw':
'12345', 'user': 'guest', 'server': '127.0.0.1'}
class: B
kwargs : {'database': 'genbank', 'passw': '12345', 'user': 'guest',
'server': '127.0.0.1'}
end

che e' quello che vorrei

cioe' *kwargs il dizionario lo vuole spacchettato?




>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>


Maggiori informazioni sulla lista Python