gpt4 book ai didi

python - 如何停止 argparse.FileType 创建指定为默认的文件

转载 作者:太空狗 更新时间:2023-10-29 21:08:46 24 4
gpt4 key购买 nike

我喜欢 argparse 模块。 argparse.FileType 也很有用,除非您希望默认值不是 sys.std* 因为即使您提供了默认输出文件也会创建值(value)。

例如:

parser.add_argument('--outfile', type=FileType('w'), default="out.txt")

即使您使用 --outfile 指定文件,也会创建 out.txt。

我能想到的最好的是:

class MagicFileType(object):

def __init__(self, *args, **kwargs):

# save args/kwargs and set filetype to None
self.filetype = None
self.args = args
self.kwargs = kwargs

def __getattr__(self, attr):
""" Delegate everything to the filetype """

# If we haven't created it, now is the time to do so
if self.filetype is None:
self.filetype = FileType(*self.args, **self.kwargs)
self.filetype = self.filetype(self.filename)

return getattr(self.filetype, attr)

def __call__(self, filename):
""" Just cache the filename """

# This is called when the default is created
# Just cache the filename for now.
self.filename = filename
return self

但如果感觉这应该更容易,我是不是错过了什么?

最佳答案

argparse 有一个相对较新的变化,http://bugs.python.org/issue12776 (2012 年 8 月),这会延迟对默认值的评估。最初,字符串默认值会在解析开始时通过 type(通过 _get_value)传递,导致打开(和创建)FileType 文件(无论是需要与否)。在此补丁中,字符串被写入命名空间,但直到解析结束时才进行评估,此时它可以确定是否提供了另一个值。基本上,这一行从 parse_known_args 的早期移动到 _parse_known_args

的末尾
default = self._get_value(action, action.default)

http://bugs.python.org/issue13824我提出了一个提供 FileContext 类型的补丁。它与 FileType 的主要区别在于它将 open(file...) 包装在 partial 中。这样,文件不会打开(或创建),直到在 with args.output() as f: 上下文中实际使用。

该补丁处理一些其他事情,例如测试文件是否可以创建(使用 os.access)以及将 stdin/out 包装在虚拟上下文中,因此它不会尝试关闭它。

无需测试,您可以像这样修改 FileType:

class FileOpener(argparse.FileType):
# delayed FileType;
# sample use:
# with args.input.open() as f: f.read()
def __call__(self, string):
# optionally test string
self.filename = string
return self
def open(self):
return super(FileOpener,self).__call__(self.filename)
file = property(open, None, None, 'open file property')

关于python - 如何停止 argparse.FileType 创建指定为默认的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19055457/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com