What does this to in python super().__init__(**kwargs)

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)

Upvotes: 4

Views: 19453

Answers (2)

0MR4N
0MR4N

Reputation: 111

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, ...)

Upvotes: 5

tdelaney
tdelaney

Reputation: 77387

  • 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.

Upvotes: 13

Related Questions