Ответ 1
Вы можете использовать eval():
myString = "fullName( name = 'Joe', family = 'Brand' )"
result = eval(myString)
Остерегайтесь, однако, eval()
считается злом многими людьми.
Несколько дней назад я искал в сети, и я нашел интересную статью о словарях python. Речь шла об использовании клавиш в словаре для вызова функции. В этой статье автор определил некоторые функции, а затем словарь с ключом точно так же, как имя функции. Затем он мог получить входной параметр от пользователя и вызвать тот же метод (что-то вроде реализации разрыва случая) После этого я понял одно и то же, но как-то иначе. Я хочу знать, как я могу это реализовать. Если у меня есть функция:
def fullName( name = "noName", family = "noFamily" ):
return name += family
И теперь, если у меня есть строка вроде этого:
myString = "fullName( name = 'Joe', family = 'Brand' )"
Есть ли способ выполнить этот запрос и получить результат: JoeBrand
Например, что-то, что я помню, это то, что мы можем привести строку к выражению exec(), и это делает это для нас. Но я не уверен в этом специальном случае, а также не знаю, как эффективно работает Python. И также я буду так благодарен, чтобы помочь мне, как обрабатывать возвращаемые значения функций, например, в моем случае, как я могу напечатать полное имя, возвращаемое этой функцией?
Вы можете использовать eval():
myString = "fullName( name = 'Joe', family = 'Brand' )"
result = eval(myString)
Остерегайтесь, однако, eval()
считается злом многими людьми.
Это точно не отвечает на ваш вопрос, но, возможно, это все же помогает:
Как уже упоминалось, eval
следует избегать, если это возможно. Лучший способ imo - использовать распаковку словаря. Это также очень динамично и менее подвержено ошибкам.
Пример:
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
Я знаю, что этот вопрос довольно старый, но вы можете сделать что-то вроде этого:
argsdict = {'name': 'Joe', 'family': 'Brand'}
globals()['fullName'](**argsdict)
argsdict
- словарь аргумента, globals
вызывает функцию с использованием строки, а **
расширяет словарь до списка параметров. Гораздо чище, чем eval
. Единственная проблема заключается в разделении строки. A (очень грязное) решение:
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)
Вы можете попробовать eval()