Мне нравится модуль argparse
. argparse.FileType
также полезен, если вы не хотите, чтобы по умолчанию было что-то отличное от sys.std*
, поскольку выходной файл по умолчанию создается, даже если вы указываете значение.
Например:
parser.add_argument('--outfile', type=FileType('w'), default="out.txt")
создаст out.txt, даже если вы укажете файл с параметром --outfile.
Лучшее, что я могу придумать, это:
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
Но если кажется, что это должно быть проще, я что-то упускаю?
--outfile
, я получаю только тот файл, который я создал, а не оба. Какая у вас версия питона? Возможно, это ошибка в модулеargparse
для определенной версии. я на 2.7.5 - person Brian   schedule 27.09.2013input
, и решения касаются этого случая, но не случая выходного файла. - person John Gill   schedule 27.09.2013