str separar por contar comparar caracteres caracter cadenas python string function

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)