为什么这个参数解包不起作用?
我遇到了一个错误,提示内容是 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}