k4kuz0
k4kuz0

Reputation: 1045

TypeError: __init__() takes 4 positional arguments but 5 were given

I have looked up similar questions, yet most problems are related to omitting the self argument in the __init__ definition.

Code:

class steamurl():

    baseurl = "http://api.steampowered.com/{0}/{1}/{2}/"

    def __init__(self, loc1, loc2, vnum, **options):
        self.loc1 = loc1
        self.loc2 = loc2
        self.vnum = vnum
        self.options = options

optionsdic = {
    'key': 'KEYHERE',
    'game_mode': 'all_pick',
    'min_players': '7'
    }

testurl = steamurl("IDOTA2Match_570", "GetMatchHistory", "v001", optionsdic)

However here my code was working fine before I added the "optionsdic" to the class. After adding it I get the type error in the title. Am I using **kwargs incorrectly as an argument?

Upvotes: 0

Views: 6943

Answers (3)

BrenBarn
BrenBarn

Reputation: 251365

If you want to pass the contents of optionsdic as separate keyword arguments, you need to use ** unpacking:

testurl = steamurl("IDOTA2Match_570", "GetMatchHistory", "v001", **optionsdic)

Upvotes: 8

Simeon Visser
Simeon Visser

Reputation: 122336

You should call using **:

testurl = steamurl("IDOTA2Match_570", "GetMatchHistory", "v001", optionsdic)

This will unpack the dictionary into separate keyword arguments. In __init__ the keyword arguments will then be packed into a dictionary due to **options.

Upvotes: 5

Martijn Pieters
Martijn Pieters

Reputation: 1121366

You need to use ** to apply optionsdic as keyword arguments:

testurl = steamurl("IDOTA2Match_570", "GetMatchHistory", "v001", **optionsdic)

otherwise it is just another positional argument passing in a dictionary object.

This mirrors the syntax in the function signature.

Upvotes: 9

Related Questions