Как использовать пространство имен, возвращаемое parse_known_args? - PullRequest
4 голосов
/ 26 июля 2011

В настоящее время я пишу скрипт на Python и пытаюсь динамически генерировать некоторые аргументы.Тем не менее выдается ошибка для следующего скрипта с указанием 'Namespace' object is not iterable. Любые идеи о том, как исправить?

import argparse
from os import path
import re

replacements = {}
pattern = '<<([^>]*)>>'

def user_replace(match):
   ## Pull from replacements dict or prompt
    placeholder = match.group(1)
    return (replacements[placeholder][0] 
         if placeholder in replacements else 
          raw_input('%s? ' % placeholder))

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('infile', type=argparse.FileType('r'))
    parser.add_argument('outfile', type=argparse.FileType('w'))

    required, extra = parser.parse_known_args()
    infile, outfile = required.infile, required.outfile
    args = re.findall(pattern, infile.read())
    args = list(set(args))
    infile.seek(0)

    parser = argparse.ArgumentParser()
    for arg in args:
        parser.add_argument('--' + arg.lower())

    replacements = vars(parser.parse_args(extra))

    matcher = re.compile(pattern)

    for line in args.infile:
        new_line = matcher.sub(user_replace, line)
        args.outfile.write(new_line)

    args.infile.close()
    args.outfile.close()

if __name__ == '__main__':
    main()

Ошибка с возвращенным значением parser.parse_known_args ().Любые идеи о том, как я мог бы обойти это хотя?Кто-то предложил создать объект и использовать интерфейс dict , но я не знаю, что именно это влечет за собой.Я действительно новичок в Python, поэтому не понимаю, почему (infile, outfile), extra = parser.parse_known_args () не будет работать.

Редактировать: Обновлено с двумя исправлениями.Сначала исправьте ошибку выше, используя принятый ответ ниже.Во-вторых, также исправлена ​​ошибка, при которой меня отмечали за попытку добавить один и тот же аргумент дважды.Исправлена ​​ошибка, из-за которой аргументы становились множеством, а затем возвращались к списку.Теперь мой скрипт выполняется, но дополнительные аргументы не имеют никакого эффекта.Есть идеи?

Ответы [ 3 ]

10 голосов
/ 27 июля 2011

ArgumentParser.parse_known_args возвращает пространство имен и список оставшихся аргументов.Пространства имен не повторяемы, поэтому при попытке присвоить одно из них кортежу (infile, outfile) вы получаете ошибку «не повторяем».

Вместо этого вы должны написать что-то вроде

namespace, extra = parser.parse_known_args()

а затем получить доступ к проанализированным аргументам как namespace.infile и namespace.outfile.

4 голосов
/ 24 сентября 2013

У меня была похожая проблема с методом parse_args (). Я хотел использовать пространство имен в качестве словаря. Так как это похоже на диктовку, это должно быть возможно!

args = parser.parse_args()
for k, v in args: -> "'Namespace' object is not iterable."
for k, v in dict(args): -> "'Namespace' object is not iterable."

for k, v in args.__dict__.iteritems():
    print(k, v) # Works!

# Or just use it as any other dictionary
d.update(args.__dict__)
f(**args.__dict__)
0 голосов
/ 12 декабря 2011

На самом деле эта строка кода должна выглядеть следующим образом:

namespace= parser.parse_known_args()

В противном случае все равно появляется ошибка о невозможности повторения пространств имен.

...