Я создаю удаленный API для модуля Python, который я написал. Код будет принимать необработанные строки, полученные из Matlab через UDP, анализировать их и выполнять вызовы API через эти строки. По сути, я хочу взаимодействовать с моим API на стороне Matlab с синтаксисом Python.
Скажем, у меня есть функция:
commands = {'foo':foo}
def foo(arg1=default, arg2=default):
...
return bar
В Matlab я отправляю это по UDP:
'foo(arg1='in1', arg2='in2')'
На стороне сервера Python у меня есть словарь с именами функций в качестве ключей и самими соответствующими функциями в качестве значений. Я могу вызывать простые функции без аргументов или простые аргументы, но в более сложных случаях я не могу заставить это работать.
Итак, у меня есть функция, у меня есть аргументы в виде строки, как я могу передать аргументы функции в виде этой строки самым прямым способом?
I.e.
command = commands['foo']
command(argString)
Если это вообще возможно, я бы хотел избежать использования kwargs. Я изучил подобные вопросы, но пока не нашел ничего, что работает.
Изменить Вот более конкретный код; сервер уже запущен, пакет UDP обрабатывается в «прерывании», когда вызывается команда define_command.
Отправляемый пакет Matlab:
cmd = ['get_surrounding_elevation(mode=''coords'',window=3,' ...
'coordinates=Coordinate(36.974117, -122.030796))'];
Конец питона:
def func_explode(self, s):
pattern = r'(\w[\w\d_]*)\((.*)\)$'
match = re.match(pattern, s)
if match:
return list(match.groups())
else:
return []
def determine_command(self, command):
"""
Parse raw input and execute specified function with args
:param command: The raw command retrieved from UDP
:return: the command that was executed
"""
funcArray = self.func_explode(command)
cmd = self.commands[funcArray[0]]
args = funcArray[1]
print cmd(mode='coords', window=3, coordinates=Coordinate(36.974117, -122.030796)) #this works
try:
cmd(eval(args)) #this, and other permutations of, doesn't work
print cmd
except:
print "Command Not Found"
return cmd
commands
? - person Anand S Kumar   schedule 13.08.2015eval
записать строку аргументов в словарь и добавить ее в свою команду. 3) Или вы могли бы просто пойти дальше иeval
всю строку, включая команду, с обычным отказом от ответственности о том, что это небезопасно для нефильтрованного ввода и, как правило, плохой способ работы. - person jme   schedule 13.08.2015