Perché questo disimballaggio degli argomenti non funziona?
-
21-12-2019 - |
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.
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'})
.