передача словаря по ссылке вместо использования eval / как передать переменное число аргументов - PullRequest
0 голосов
/ 09 февраля 2012

Я читал несколько вопросов о том, чтобы не использовать exec или eval в коде Python.

В настоящее время у меня есть веб-программа на Python, основанная на пирамиде, и она берет некоторые переменные из формы и вызывает функцию. Весь аргумент этой функции или необязательный, таким образом, более или менее то, что я делаю, это

command = 'function_to_be_called ('

if optional_variable_in_form in request.params :
    command += 'optional_variable=optional_variable_in_form'

command += ')'

i = eval (command)

Я пытаюсь улучшить свое приложение и пытаюсь заменить eval чем-то другим. Я нашел этот ответ , где автор предлагает передать словарь по ссылке вместо использования моего решения.

Итак, мои вопросы:

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

1 Ответ

5 голосов
/ 09 февраля 2012

Вы можете просто сделать:

function_to_be_called(**option_dict)

Старый способ сделать это был с помощью функции apply, но теперь он не рекомендуется для синтаксиса *args и **keywords.

На самом деле это действительно круто, так как это означает, что вы можете иметь функцию и кортеж аргументов и вызывать функцию, поэтому:

def polly(cracker, wants):
    if wants:
       print 'polly wants a', cracker
f = polly
t = ('cracker', True)

Теперь все они эквивалентны:

polly('cracker', True)
polly(*('cracker', True))
polly(*t)
f('cracker', True)
f(*t)

Теперь разверните это для аргументов ключевых слов - но посмотрите настоящий учебник. Но, как указывает @Duncan, вы можете сделать это:

polly(**{cracker: 'cracker', wants: True})
d = {cracker: 'biscuit', wants: True}
polly(**d)
...