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

use*_*783 11 python argument-unpacking python-2.7

我收到一个错误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
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

prompt模块只是一串raw_input返回字符串或整数(int for age)的s .

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

Ric*_*dle 11

你只想要一个星号:

create_character = player.Create(*generate_player.generate())
Run Code Online (Sandbox Code Playgroud)

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

player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 11

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

generate()另一方面,您的函数返回元组,而不是字典.您可以使用一个星号将一个元组作为具有类似语法的单独参数传递:

create_character = player.Create(*generate_player.generate())
Run Code Online (Sandbox Code Playgroud)

或者,修复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}
Run Code Online (Sandbox Code Playgroud)

  • @Bananach:请参阅[映射](https://docs.python.org/3/glossary.html#term-mapping),因此任何具有[`collections.abc.Mappings`方法](https://docs .python.org/3/library/collections.abc.html#collections-abstract-base-classes)。`*` 需要一个 [iterable](https://docs.python.org/3/glossary.html#term-iterable)。 (2认同)