如何使用parse_known_args返回的命名空间?

8 投票
3 回答
22721 浏览
提问于 2025-04-16 22:19

我现在正在写一个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() 这样写会不行。

编辑:更新了两个修复。首先,通过使用下面的接受答案修复了上面的错误。其次,还修复了一个错误,我因为试图添加同一个参数两次而被标记。通过先把 args 变成一个集合,然后再转回列表来解决了这个问题。现在我的脚本可以运行了,但可选参数没有效果。有什么建议吗?

3 个回答

0

其实,那行代码应该这样写:

namespace= parser.parse_known_args()

否则,你还是会遇到关于命名空间不可迭代的错误。

5

我遇到了一个和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__)
19

ArgumentParser.parse_known_args 这个方法会返回一个 命名空间 和一个剩余参数的列表。命名空间是不能被遍历的,所以当你试图把它赋值给元组 (infile, outfile) 时,就会出现“不可遍历”的错误。

相反,你应该写成这样:

namespace, extra = parser.parse_known_args()

然后你可以通过 namespace.infilenamespace.outfile 来访问解析后的参数。

撰写回答