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

时间:2014-04-11 10:18:09

标签: python python-2.7 argument-unpacking

我收到错误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的int)。

为什么它会返回元组?当我在print type模块中运行generate_player时,我会为我的参数获取string,int,string。

3 个答案:

答案 0 :(得分:10)

**语法需要映射(例如字典);映射中的每个键值对都成为关键字参数。

另一方面,您的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}

答案 1 :(得分:2)

你只需要一个星号:

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

您正在传递一系列参数,您使用一个星号。双星号语法用于传递映射,例如执行以下操作:

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

答案 2 :(得分:0)

FWIW,就我而言,我在字典定义的末尾留下了一个逗号 ,,例如,

params = {...}, 

f(**params)

params 现在是一个 1 元组,字典是它的元素,因此错误......删除逗号可以解决它。