Функция Python вызывается со всеми аргументами, заданными в виде строки

Я создаю удаленный 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

person RYS    schedule 13.08.2015    source источник
comment
Можете ли вы привести простой воспроизводимый пример того, как выглядит argString и как выглядит commands?   -  person Anand S Kumar    schedule 13.08.2015
comment
А также как создается argString.   -  person Anand S Kumar    schedule 13.08.2015
comment
Кажется довольно неуклюжим делать вызовы API, отправляя строку кода Python. Почему бы не отправить более структурированные данные, например, какой-нибудь JSON, описывающий вызываемую функцию и ее аргументы?   -  person jme    schedule 13.08.2015
comment
Я бы хотел избежать использования kwargs. Почему?   -  person msw    schedule 13.08.2015
comment
Сейчас добавляю пример - смотрите правки. @jme: согласен, неуклюже, но более естественно. Может быть, я переключусь; тем не менее, все еще не решает проблему под рукой.   -  person RYS    schedule 13.08.2015
comment
@msw: потребуется переписать хороший кусок кода, кроме того, я все еще хочу выполнять вызовы API на чистом питоне. Если вы можете привести веские доводы в пользу этого, возможно, но сейчас мне просто нужно получить чертову строку аргумента в функцию!   -  person RYS    schedule 13.08.2015
comment
Хорошим примером может быть то, что вы не можете сделать это по-своему и, похоже, не в состоянии сформулировать, каков ваш путь. Это хороший признак того, что вы, вероятно, делаете что-то не так.   -  person msw    schedule 13.08.2015
comment
У меня есть функция, и у меня есть аргументы для этой функции в виде строки, нужно соединить их вместе, и все готово. Не нужно отношение.   -  person RYS    schedule 13.08.2015
comment
1) На самом деле, я бы сказал, что JSON более естественен, и именно так часто делаются подобные вещи. 2) Непонятно, почему вам пришлось бы переписывать кучу кода, если бы вы использовали **kwargs. Какой код? В противном случае вы могли бы просто eval записать строку аргументов в словарь и добавить ее в свою команду. 3) Или вы могли бы просто пойти дальше и eval всю строку, включая команду, с обычным отказом от ответственности о том, что это небезопасно для нефильтрованного ввода и, как правило, плохой способ работы.   -  person jme    schedule 13.08.2015


Ответы (1)


Попробуй это:

def foo(*args):
    for a in args:
         print a

#main for test
# call as foo (a1, a2) etc

foo(1, 2, 3)
foo("abc", 1)

Вывод:

1

2

3

азбука

1

person Dr. Debasish Jana    schedule 13.08.2015