separar - str en python
Use una cadena para llamar a la funciĆ³n en Python (3)
Esta pregunta ya tiene una respuesta aquí:
Hace unos días estaba buscando en la red y encontré un artículo interesante sobre los diccionarios de Python. Se trataba de usar las teclas del diccionario para llamar a una función. En ese artículo, el autor ha definido algunas funciones y luego un diccionario con la clave exactamente igual al nombre de la función. Luego podría obtener un parámetro de entrada del usuario y llamar al mismo método (algo así como implementar un salto de caso). Después de eso me di cuenta de lo mismo pero de alguna manera diferente. Quiero saber cómo puedo implementar esto. Si tengo una función:
def fullName( name = "noName", family = "noFamily" ):
return name += family
Y ahora si tengo una cuerda como esta:
myString = "fullName( name = ''Joe'', family = ''Brand'' )"
¿Hay una manera de ejecutar esta consulta y obtener un resultado: JoeBrand
Por ejemplo, algo que recuerdo es que podemos darle una cadena a exec () y lo hace por nosotros. Pero no estoy seguro de este caso especial, y tampoco conozco la manera eficiente en Python. Y también estaré tan agradecido de ayudarme a manejar el valor de retorno de esas funciones, por ejemplo, en mi caso, ¿cómo puedo imprimir el nombre completo que devuelve esa función?
Esto no responde exactamente a tu pregunta, pero quizás ayude de todas formas:
Como se mencionó, la eval
debe evitarse si es posible. Una mejor manera de imo es usar el desempaquetado del diccionario. Esto también es muy dinámico y menos propenso a errores.
Ejemplo:
def fullName(name = "noName", family = "noFamily"):
return name + family
functionList = {''fullName'': fullName}
function = ''fullName''
parameters = {''name'': ''Foo'', ''family'': ''Bar''}
print functionList[function](**parameters)
# prints FooBar
parameters = {''name'': ''Foo''}
print functionList[function](**parameters)
# prints FoonoFamily
Podrías usar eval() :
myString = "fullName( name = ''Joe'', family = ''Brand'' )"
result = eval(myString)
Tenga cuidado, sin embargo, eval()
es considerado malo por muchas personas.
Sé que esta pregunta es bastante antigua, pero podrías hacer algo como esto:
argsdict = {''name'': ''Joe'', ''family'': ''Brand''}
globals()[''fullName''](**argsdict)
argsdict
es un diccionario de argumentos, globals
llama a la función usando una cadena y **
expande el diccionario a una lista de parámetros. Mucho más limpio que eval
. El único problema radica en dividir la cadena. Una solución (muy desordenada):
example = ''fullName(name=/'Joe/',family=/'Brand/')''
# Split at left parenthesis
funcname, argsstr = example.split(''('')
# Split the parameters
argsindex = argsstr.split('','')
# Create an empty dictionary
argsdict = dict()
# Remove the closing parenthesis
# Could probably be done better with re...
argsindex[-1] = argsindex[-1].replace('')'', '''')
for item in argsindex:
# Separate the parameter name and value
argname, argvalue = item.split(''='')
# Add it to the dictionary
argsdict.update({argname: argvalue})
# Call our function
globals()[funcname](**argsdict)