Python 为什么这种解压参数不起作用?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23009831/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why this unpacking of arguments does not work?
提问by user3056783
I get an error type object argument after ** must be a mapping, not tuple
.
我收到一个错误type object argument after ** must be a mapping, not tuple
。
I have this code:
create_character = player.Create(**generate_player.generate())
我有这个代码:
create_character = player.Create(**generate_player.generate())
this is player.py
module:
这是player.py
模块:
class Create(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
this is generate_player.py
module:
这是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
The prompt
module is just bunch of raw_input
s that return either string or integers (int for age
).
该prompt
模块只是一堆raw_input
返回字符串或整数(int for age
)的s 。
Why is it returning tuples? When I run print type
in generate_player
module I get string, int, string for my arguments.
为什么它返回元组?当我print type
在generate_player
模块中运行时,我的参数得到 string、int、string。
采纳答案by Martijn Pieters
The **
syntax requires a mapping(such as a dictionary); each key-value pair in the mapping becomes a keyword argument.
的**
语法要求一个映射(如字典); 映射中的每个键值对都成为关键字参数。
Your generate()
function, on the other hand, returns a tuple, not a dictionary. You can pass in a tuple as separate arguments with similar syntax, using just oneasterisk:
generate()
另一方面,您的函数返回一个元组,而不是一个字典。您可以将元组作为具有类似语法的单独参数传入,只需使用一个星号:
create_character = player.Create(*generate_player.generate())
Alternatively, fix your generate()
function to return a dictionary:
或者,修复您的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}
回答by RichieHindle
You just want a single asterisk:
你只需要一个星号:
create_character = player.Create(*generate_player.generate())
You're passing a sequence of arguments, for which you use one asterisk. The double-asterisk syntax is for passing a mapping, for instance to do something like this:
您正在传递一系列参数,为此您使用一个星号。双星号语法用于传递映射,例如执行以下操作:
player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})