4

I know that super is used to call the init method in the superclass, I'm having trouble understanding what kwargs does I know it takes key arguments

what does it do here?

class LoginScreen(GridLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text = "Username: "))
        self.username = TextInput(multiline = False)
        self.add_widget(self.username)

        self.add_widget(Label(text="Password: "))
        self.username = TextInput(multiline=False, password=True)
        self.add_widget(self.username)

        self.add_widget(Label(text="Two Factor Auth: "))
        self.tffa = TextInput(multiline=False, password=True)
        self.add_widget(self.tffa)
tdelaney
  • 73,364
  • 6
  • 83
  • 116
  • 1
    Possible duplicate of [What does \*\* (double star) and \* (star) do for parameters?](http://stackoverflow.com/questions/36901/what-does-double-star-and-star-do-for-parameters) – DYZ Jan 30 '17 at 05:51

2 Answers2

12
  • def __init__(self, **kwargs): packs all of the keyword arguments used in any given call to __init__ into a dict

  • super().__init__(**kwargs): expands them into keyword arguments again.

It's like a wildcard for function parameters. It can be a lazy way to give the subclass the same parameter signature as the parent without bothering to type all of the possible keyword parameters in again.

Just grab them as a blob and shovel them off to the parent to figure out.

Tms91
  • 3,456
  • 6
  • 40
  • 74
tdelaney
  • 73,364
  • 6
  • 83
  • 116
4

For example you put this :

x = LoginScreen(size=1, blahblah=2, something=3)

We have now:

>>> print(kwargs)
{'size': 1, 'blahblah': 2, 'something': 3}

So if it reaches the following line: super().__init__(**kwargs) it will be equal to that : super().__init__(size=1, blahblah=2, something=3)

Becarefully: if you didn't put double asterisks "**" it will be equal to one argument as key:

`super().__init__({'size': 1, 'blahblah': 2, 'something': 3})`

And you can also use it like that:

options = [1,2,3]
def func(first=None, second=None, last=None):
    print("first arg:", first)
    print("second arg:", second)
    print("third arg:", last)

func(*options)

Here we use one asterisk since this is a list not a dict so that means expand the options list for each argument, the output will be:

first arg: 1
second arg: 2
third arg: 3

But if we call options without the asterisk.

func(options)

See what's gonna happen:

first arg: [1, 2, 3]
second arg: None
third arg: None

The samething with kwargs except they go like that:

fuction(key1=value1, key2=value2, key3=value3, ...)
Y4RD13
  • 937
  • 1
  • 16
  • 42
0MR4N
  • 91
  • 3