web-dev-qa-db-ja.com

なぜこの引数の展開が機能しないのですか?

エラー_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モジュールは、文字列または整数(ageの整数)を返す_raw_input_ sの集まりです。

なぜタプルを返すのですか? _print type_モジュールで_generate_player_を実行すると、引数としてstring、int、stringが取得されます。

13
user3056783

_**_構文にはmappingdictionaryなど)が必要です。マッピング内の各キーと値のペアがキーワード引数になります。

一方、generate()関数は、辞書ではなくタプルを返します。 oneアスタリスクを使用するだけで、タプルを同様の構文の個別の引数として渡すことができます。

_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}
_
14
Martijn Pieters

あなたはただ一つのアスタリスクが欲しい:

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

1つのアスタリスクを使用する一連の引数を渡しています。ダブルアスタリスクの構文は、たとえば次のようなことを行うために、マッピングを渡すためのものです。

player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})
3
RichieHindle