我试图使用Python argparse中的默认值而不是用户指定的参数。例如,这是一个论点:
parser.add_argument(' - fin',默认=' file.txt')
如果用户调用--fin dog,那显然不是文件,所以我希望能够使用默认值。我该怎么办? argparse是否有一个使用默认值而不是输入参数的函数?对于任何打字错误也很抱歉,我在手机上这样做。
答案 0 :(得分:4)
使用parser.parse_args()
的返回值无法访问默认参数。更重要的是,“狗”显然不是一个文件?这是任何现代操作系统上完全有效的文件名;文件扩展名很常见,但绝不是必需的。
确定某些内容是否为文件的唯一方法是尝试打开它。如果失败,则它不是文件,或者您无权访问它。
在这种情况下,最佳解决方案可能是:
DEFAULT_FIN = 'file.txt'
parser.add_argument('--fin', default=DEFAULT_FIN)
后来:
try:
fd = open(args.fin)
except IOError:
fd = open(DEFAULT_FIN)
虽然我认为如果用户在命令行中指定文件名并且您无法打开它,那么您应该打印错误并退出。
答案 1 :(得分:0)
你可以:
argument_file = parser.add_argument('--fin', default='file.txt')
args = parser.parse_args()
try:
fo = open(args.fin)
except:
fo = open(argument_file.default)
print fo.read()
但是持续不断的larsks解决方案似乎更好。
答案 2 :(得分:0)
如果在定义参数的标识符时挂起参数的标识符,则可以找到参数的默认值。 e.g。
In [119]: parser=argparse.ArgumentParser()
In [120]: arg1 = parser.add_argument('--fin', default='default.txt')
In [121]: arg1.default
Out[121]: 'default.txt'
arg1
,add_argument
方法返回的值是解析器使用的Action
对象。它包含您为方法提供的所有信息。 arg1.default
只是其中一个属性。
因此,您可以在帖子arg1.default
代码中使用parse_args
来检查args.fin
是否为有效文件。
larsks
方法同样出色,因为您(用户)首先定义了默认值。
您还可以编写自定义Action类或执行此检查的参数类型。有一个内置argparse.FileType
试图打开该文件,如果不能,则引发ArgumentType错误。可以修改为使用默认值。但这是一个更高级的解决方案,并且明显优于在解析后进行自己的检查。