2014-02-20 2 views
0

Я хочу, чтобы иметь возможность кодировать и декодировать метод, пары аргументов через json. Что-то вроде этого:Как восстановить команды из json закодированного объекта

fn = 'simple_function' 
arg = 'blob' 

encoded = json.dumps([fn, arg]) 
decoded = json.loads(encoded) 

method, args = decoded 
fn = getattr(self, method) 
fn(*args) 

Но это не удается, потому что питон разбивает строку «блоб» вверх в кортеж для каждого персонажа (странное поведение). Я думаю, это работает, если аргументы являются фактическим списком элементов. Он также терпит неудачу, если мы хотим не отправлять какие-либо аргументы, вызывая функцию без параметров (недостаточно значений для распаковывания ошибки.)

Как построить очень общий механизм для этого? Я пытаюсь сделать сервер, который может вызывать функции на клиенте таким образом, главным образом потому, что я не знаю, как это сделать.

Итак, ищем решение, которое позволит мне вызвать функции без одного или любого числа аргументов.

Идеальное решение может выглядеть примерно так:

def create_call(*args): 
    cmd = json.dumps(args) 

def load_call(cmd): 
    method, optional_args = json.loads(*cmd) 
    fn = getattr(object, method) 
    fn(*optional_args) 

И будет работать без аргументов, одна единственной строка аргумента, который не получает разделиться, чтобы список на *, или список любого виды аргументов.

ответ

0

Ваши аргументы - это один объект. Не список. Так что вам нужно либо

fn = 'simple_function' 
arg = 'blob' 

encoded = json.dumps([fn, arg]) 
decoded = json.loads(encoded) 

method, args = decoded 
fn = getattr(self, method) 
fn(args) #don't try to expand the args 

ИЛИ

fn = 'simple_function' 
arg = 'blob' 

encoded = json.dumps([fn, [arg]]) #make sure to make a list of the arguments 
decoded = json.loads(encoded) 

method, args = decoded 
fn = getattr(self, method) 
fn(*args) 

ИЛИ

fn = 'simple_function' 
arg = 'blob' 

encoded = json.dumps([fn, arg]) 
decoded = json.loads(encoded) 

method, args = decoded[0], decoded[1:] #cut them up into a single function name and list of args 
fn = getattr(self, method) 
fn(*args) 

Какой "или" действительно зависит от того, что вы хотите.

+0

Но если у меня есть функция без аргументов, это будет передавать пустой список. –

+0

@ user11177 Добавлен дополнительный вариант, который должен поддерживать это. –

Смежные вопросы