python - Why should we pass args as args and not "*args"? -
as i'm reading django documentation, see in example:
from django.db import models class handfield(models.field): description = "a hand of cards (bridge style)" def __init__(self, *args, **kwargs): kwargs['max_length'] = 104 super(handfield, self).__init__(*args, **kwargs)
i dont understand why call super is:
super(handfield, self).__init__(*args, **kwargs)
whereas (coming c programming) thought should be:
super(handfield, self).__init__(args, kwargs)
how comes?
yes. , i'm not asking mean "*
" , "**
" (link marked duplicate), i'm asking why it's not re-sent without star = why it's re-sent parent with stars, means me: "dictionary of dictionary". , question different duplicate link, , duplicate link doesnt answer question.
the reason use *
/**
unpack packed values given. when class initialized, might initialized with:
handfield(1, 2, 3, abc=4, xyz=5)
because receives arguments using variable length positional (*
) , dynamic keyword (**
) arguments (to avoid needing remember , deal specifics of parent class constructor receives), args
received (1, 2, 3)
, kwargs
{'abc': 4, 'xyz': 5}
. if parent class defined __init__
of:
def __init__(self, a1, a2, a3, spam=6, eggs=7, abc=none, xyz=none):
then calling super(handfield, self).__init__(args, kwargs)
pass args
tuple
a1
, kwargs
dict
a2
, , pass nothing @ a3
or other arguments. unpacking args
, kwargs
, convert individual positional , keyword arguments, a1
1
, a2
2
, a3
3
, abc
4
, xyz
5
.
basically, they're inverse operations; if accept *
, caller passes positional arguments 1 one , "packed" single tuple
, accepting **
accepts individual keyword arguments "packed" single dict
. if want pass them along same way, "unpack" them make them individual arguments, not collections of arguments.
Comments
Post a Comment