如何使用parse_known_args返回的命名空间?
我现在正在写一个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.infile
和 namespace.outfile
来访问解析后的参数。