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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-19 02:07:39  来源:igfitidea点击:

Why this unpacking of arguments does not work?

pythonpython-2.7argument-unpacking

提问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.pymodule:

这是player.py模块:

class Create(object):

    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

this is generate_player.pymodule:

这是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 promptmodule is just bunch of raw_inputs 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 typein generate_playermodule I get string, int, string for my arguments.

为什么它返回元组?当我print typegenerate_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'})