Domanda

ottengo un errore type object argument after ** must be a mapping, not tuple.

Ho questo codice: create_character = player.Create(**generate_player.generate())

Questo è il modulo player.py:

class Create(object):

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

Questo è il modulo 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
.

Il modulo prompt è solo un grappolo di generatori di generatori che restituisce stringa o interi (int per raw_input).

Perché sta tornando le tuple?Quando eseguo age nel modulo print type, ottengo una stringa, int, stringa per i miei argomenti.

È stato utile?

Soluzione

La sintassi ** richiede una mappatura (come un dizionario );Ogni coppia di valore chiave nella mappatura diventa un argomento della parola chiave.

La tua funzione generate(), d'altra parte, restituisce una tupla, non un dizionario.Puoi passare in una tupla come argomenti separati con sintassi simile, usando solo one asterisco:

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

In alternativa, correggi la funzione generate() per restituire un dizionario:

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}
.

Altri suggerimenti

Vuoi solo un singolo asterisco:

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

Stai passando una sequenza di argomenti, per i quali usi un asterisco.La sintassi del doppio asterisco è per passare una mappatura, ad esempio per fare qualcosa del genere:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top