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

时间:2015-05-04 19:30:38

标签: python

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?

3 个答案:

答案 0 :(得分:8)

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.

答案 1 :(得分:7)

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)

答案 2 :(得分:4)

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.