¿Por qué esta división de argumentos no funciona?
-
21-12-2019 - |
Pregunta
Me sale un error type object argument after ** must be a mapping, not tuple
.
Tengo este código:create_character = player.Create(**generate_player.generate())
este es player.py
módulo:
class Create(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
este es generate_player.py
módulo:
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
El prompt
el módulo es sólo montón de raw_input
s que devolver o cadena de enteros (int para age
).
¿Por qué es regresar tuplas?Cuando ejecuto print type
en generate_player
módulo I get string, int, string para mis argumentos.
Solución
El **
sintaxis requiere un la asignación de (como un diccionario);cada par clave-valor en la asignación se convierte en una palabra clave argumento.
Su generate()
la función, por el contrario, devuelve una tupla, no un diccionario.Se puede pasar de una tupla como argumentos separados con sintaxis similar, utilizando sólo uno asterisco:
create_character = player.Create(*generate_player.generate())
Alternativamente, fijar su generate()
función para devolver un diccionario:
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}
Otros consejos
Solo quieres un asterisco:
create_character = player.Create(*generate_player.generate())
Que está pasando una secuencia de argumentos, para que usted utilice un asterisco.El doble asterisco sintaxis es para pasar una asignación, por ejemplo, para hacer algo como esto:
player.Create(**{'name': 'Richie', 'age': 21, 'gender': 'male'})