为什么这个参数解包不起作用?

32 投票
3 回答
122580 浏览
提问于 2025-04-18 02:20

我遇到了一个错误,提示内容是 type object argument after ** must be a mapping, not tuple

我有这么一段代码:

create_character = player.Create(**generate_player.generate())

这是 player.py 模块的内容:

class Create(object):

    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

这是 generate_player.py 模块的内容:

import prompt

def generate():

    print "Name:"
    name = prompt.get_name()
    print "Age:"
    age = prompt.get_age()
    print "Gender M/F:"
    gender = prompt.get_gender()

    return name, age, gender

这个 prompt 模块其实就是一堆 raw_input,它们返回的结果要么是字符串,要么是整数(比如 age 返回的是整数)。

为什么它会返回元组呢?当我在 generate_player 模块里运行 print type 时,我得到的参数类型是字符串、整数、字符串。

3 个回答

1

顺便说一下,在我的情况下,我在字典定义的末尾留了一个逗号,,比如:

params = {...}, 

f(**params)

所以现在params变成了一个包含字典的1元组,这就是出错的原因……去掉那个逗号就解决了这个问题。

11

你只想要一个星号:

create_character = player.Create(*generate_player.generate())

你在传递一系列参数,这时候用一个星号。双星号的写法是用来传递一个映射,比如说你想做这样的事情:

player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})
36

这个 ** 的用法需要一个映射(比如一个字典);映射里的每一对键值都会变成一个关键字参数。

而你的 generate() 函数返回的是一个元组,而不是字典。你可以用类似的语法,把元组作为单独的参数传入,只需要用一个星号:

create_character = player.Create(*generate_player.generate())

另外,你也可以修改你的 generate() 函数,让它返回一个字典:

def generate():
    print "Name:"
    name = prompt.get_name()
    print "Age:"
    age = prompt.get_age()
    print "Gender M/F:"
    gender = prompt.get_gender()

    return {'name': name, 'age': age, 'gender': gender}

撰写回答