您可以创建自定义操作而不是类型:
import argparseimport osimport tempfileimport shutilimport atexitclass readable_dir(argparse.Action): def __call__(self, parser, namespace, values, option_string=None): prospective_dir=values if not os.path.isdir(prospective_dir): raise argparse.ArgumentTypeError("readable_dir:{0} is not a valid path".format(prospective_dir)) if os.access(prospective_dir, os.R_OK): setattr(namespace,self.dest,prospective_dir) else: raise argparse.ArgumentTypeError("readable_dir:{0} is not a readable dir".format(prospective_dir))ldir = tempfile.mkdtemp()atexit.register(lambda dir=ldir: shutil.rmtree(ldir))parser = argparse.ArgumentParser(description='test', fromfile_prefix_chars="@")parser.add_argument('-l', '--launch_directory', action=readable_dir, default=ldir)args = parser.parse_args()print (args)但这对我来说似乎有点麻烦-如果没有给出目录,它将传递一个不可读的目录,这似乎使检查目录是否首先可访问的目的无法实现。
请注意,正如评论中指出的那样,它可能
raise argparse.ArgumentError(self, ...)比更好
argparse.ArgumentTypeError。
编辑
据我所知,没有办法验证默认参数。我想
argparse开发人员只是假设,如果您提供默认值,那么它应该是有效的。最快,最简单的方法是在解析参数之后立即对参数进行验证。看起来,您只是在尝试获取一个临时目录来执行一些工作。如果是这样,您可以使用该
tempfile模块来获取一个新目录以供使用。我在上面更新了我的答案以反映这一点。我创建一个临时目录,将其用作默认参数(
tempfile已经保证它创建的目录是可写的),然后我将其注册为在程序退出时将其删除。



