Python: извлечь переменные из пространства имен

Я использую argparse в python для анализа аргументов командной строки:

parser = ArgumentParser()
parser.add_argument("--a")
parser.add_argument("--b")
parser.add_argument("--c")
args = parser.parse_args()

Теперь я хочу сделать некоторые вычисления с a, b и c. Однако я нахожу утомительным постоянно писать args.a + args.b + args.c.

Поэтому я извлекаю эти переменные:

a, b, c = [args.a, args.b, args.c]

Такой, что я могу написать a + b + c.

Есть ли более элегантный способ сделать это?

Ручное извлечение становится очень утомительным и подверженным ошибкам при добавлении большого количества аргументов.


person Lemming    schedule 29.11.2011    source источник


Ответы (2)


Если вы хотите, чтобы они были глобальными, вы можете сделать:

globals().update(vars(args))

Если вы находитесь в функции и хотите, чтобы они были локальными переменными этой функции, вы можете сделать это в Python 2.x следующим образом:

def foo(args):
   locals().update(vars(args))       
   print a, b, c
   return
   exec ""  # forces Python to use a dict for all local vars
            # does not need to ever be executed!  but assigning
            # to locals() won't work otherwise.

Этот трюк не работает в Python 3, где exec не является оператором, и вряд ли в других вариантах Python, таких как Jython или IronPython.

В целом, однако, я бы рекомендовал просто использовать более короткое имя для объекта args или использовать буфер обмена. :-)

person kindall    schedule 29.11.2011
comment
Спасибо за ответ. Это работает, но часть exec "" кажется очень уродливым взломом. Почему это необходимо? - person Lemming; 29.11.2011
comment
Исправление: не работает, если функция содержит вложенные функции. В этом случае появляется следующее сообщение об ошибке: exec "" SyntaxError: unqualified exec is not allowed in function 'main' it contains a nested function with free variables - person Lemming; 29.11.2011
comment
Ик. Я этого не знал, но в этом есть смысл. Замыкания требуют стандартного механизма локальных переменных Python, который обращается к локальным переменным по индексу. Использование оператора exec в любом месте функции вынуждает Python использовать альтернативный метод доступа к локальным переменным по имени, поскольку exec может определять или изменять локальные переменные (именно поэтому вы можете обновить locals(), если exec встречается в функции, но не иначе). ). - person kindall; 29.11.2011

Вы можете добавить вещи в локальную область, вызвав locals(). Он возвращает словарь, представляющий текущую доступную область. Вы также можете присвоить ему значения - locals()['a'] = 12 приведет к тому, что a будет находиться в локальной области видимости со значением 12.

person g.d.d.c    schedule 29.11.2011
comment
Вы не должны изменять возвращаемое значение locals(). Не гарантируется эффект, и обычно этого не происходит в CPython. docs.python.org/library/functions.html#locals - person Michael Hoffman; 29.11.2011
comment
Кажется, что это не работает без трюка exec "", о котором упоминалось. - person Lemming; 29.11.2011