25

我得到一个错误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_inputs ,它们返回字符串或整数(int for age)。

为什么它返回元组?当我print typegenerate_player模块中运行时,我得到了字符串、整数、字符串作为我的参数。

4

3 回答 3

28

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

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}
于 2014-04-11T10:25:59.030 回答
5

你只需要一个星号:

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

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

player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})
于 2014-04-11T10:22:41.367 回答
0

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

params = {...}, 

f(**params)

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

于 2021-05-08T08:21:12.660 回答