FileType类型工厂执行代码所做的大部分工作,但消息机制略有不同:In [16]: parser=argparse.ArgumentParser()
In [17]: parser.add_argument('-f',type=argparse.FileType('r'))
In [18]: args=parser.parse_args(['-f','test.txt'])
In [19]: args
Out[19]: Namespace(f=<_io.textiowrapper name="test.txt" mode="r" encoding="UTF-8">)
In [20]: args.f.read()
Out[20]: ' 0.000000, 3.333333, 6.666667, 10.000000, 13.333333, 16.666667, 20.000000, 23.333333, 26.666667, 30.000000\n'
In [21]: args.f.close()
对于有效名称,它将打开文件,您可以使用并关闭该文件。但不能在with上下文中使用它。在
如果文件不存在,它将退出,并显示一条cant open消息。在
^{pr2}$
FileType__call__用argparse.ArgumentTypeError处理错误except OSError as e:
message = _("can't open '%s': %s")
raise ArgumentTypeError(message % (string, e))
使用这种错误机制,并省略您的open,我建议:def valid_file(astring):
if not os.path.exists(astring):
msg = "The file %s does not exist! Use the help flag for input options." % astring
raise argparse.ArgumentTypeError(msg)
else:
return astring
可以用作:In [32]: parser=argparse.ArgumentParser()
In [33]: parser.add_argument('-f',type=valid_file)
In [34]: args=parser.parse_args(['-f','test11.txt'])
usage: ipython3 [-h] [-f F]
ipython3: error: argument -f: The file test11.txt does not exist! Use the help flag for input options.
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
In [35]: args=parser.parse_args(['-f','test.txt'])
In [36]: args
Out[36]: Namespace(f='test.txt')
In [37]: with open(args.f) as f:print(f.read())
0.000000, 3.333333, 6.666667, 10.000000, 13.333333, 16.666667, 20.000000, 23.333333, 26.666667, 30.000000
http://bugs.python.org/issue13824担心FileType打开文件而不关闭它。我提出了一个FileContext,它以FileType为模型,但是没有打开文件,而是返回一个可以用作以下用途的对象:with arg.file() as f:
f.read()
它将执行文件存在性或可创建性测试,而无需实际打开或创建文件。这是一个更复杂的解决方案。在