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

Python 如何使用parse_known_args返回的名称空间?,python,parsing,replace,Python,Parsing,Replace,我目前正在编写一个Python脚本,并尝试动态生成一些参数。但是,下面的脚本将抛出一个错误,指出“Namespace”对象不可编辑。关于如何修复有什么想法吗 import argparse from os import path import re replacements = {} pattern = '<<([^>]*)>>' def user_replace(match): ## Pull from replacements dict or prom

我目前正在编写一个Python脚本,并尝试动态生成一些参数。但是,下面的脚本将抛出一个错误,指出
“Namespace”对象不可编辑。
关于如何修复有什么想法吗

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()
import argparse
从操作系统导入路径
进口稀土
替换={}
模式='>'
def用户_更换(匹配):
##从替换命令或提示中提取
占位符=匹配。组(1)
返回(替换[占位符][0]
如果替换中的占位符为else
原始输入('%s?'%占位符))
def main():
parser=argparse.ArgumentParser()
parser.add_参数('infle',type=argparse.FileType('r'))
parser.add_参数('outfile',type=argparse.FileType('w'))
必需,extra=parser.parse_known_args()
infle,outfile=required.infle,required.outfile
args=re.findall(模式,infle.read())
args=列表(集合(args))
填充搜索(0)
parser=argparse.ArgumentParser()
对于args中的arg:
parser.add_参数('--'+arg.lower())
replacements=vars(parser.parse_args(额外))
matcher=re.compile(模式)
对于args.infle中的行:
new_line=matcher.sub(用户_替换,行)
args.outfile.write(新行)
args.infle.close()
args.outfile.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
错误与parser.parse_known_args()的返回值有关。有没有办法绕过这个问题?有人建议创建一个对象并使用dict接口,但我不知道这到底意味着什么。我对Python非常陌生,所以我不明白为什么(infle,outfile),extra=parser.parse_known_args()不起作用

编辑:更新了两个修复程序。首先使用下面的可接受答案修复了上述错误。其次,还修复了一个错误,即我因尝试添加同一个参数两次而被标记。通过将args设置为一个集合,然后返回到列表来修复此问题。现在我的脚本运行了,但是可选参数没有效果。有什么想法吗?

返回名称空间和剩余参数的列表。名称空间是不可iterable的,因此当您尝试将名称空间分配给tuple
(infle,outfile)
时,会出现“notiterable”错误

相反,你应该写这样的东西

namespace, extra = parser.parse_known_args()

然后以
namespace.infle
namespace.outfile
的形式访问解析后的参数实际上,这行代码应该如下所示:

namespace= parser.parse_known_args()

否则,仍然会出现名称空间不可移植的错误。

我对parse_args()方法也有类似的问题。我想将名称空间用作字典。因为它看起来像一个dict,所以它应该是可能的

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__)

已经回答了您最初的问题。
vars()
是将对象属性转换为dict的规范方法。。。