Python: извлечение переменных из пространства имен - PullRequest
8 голосов
/ 29 ноября 2011

Я использую 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.

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

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

Ответы [ 2 ]

8 голосов
/ 29 ноября 2011

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

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 или использовать буфер обмена. : -)

0 голосов
/ 29 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...