#11175: argparse.FileType now accepts encoding and errors arguments.

Patch by Lucas Maystre.
This commit is contained in:
Petri Lehtinen 2012-12-15 22:39:32 +02:00
parent 09bb89b8cf
commit 74d6c250e1
5 changed files with 60 additions and 12 deletions

View file

@ -1140,11 +1140,17 @@ class FileType(object):
same values as the builtin open() function.
- bufsize -- The file's desired buffer size. Accepts the same values as
the builtin open() function.
- encoding -- The file's encoding. Accepts the same values as the
the builtin open() function.
- errors -- A string indicating how encoding and decoding errors are to
be handled. Accepts the same value as the builtin open() function.
"""
def __init__(self, mode='r', bufsize=-1):
def __init__(self, mode='r', bufsize=-1, encoding=None, errors=None):
self._mode = mode
self._bufsize = bufsize
self._encoding = encoding
self._errors = errors
def __call__(self, string):
# the special argument "-" means sys.std{in,out}
@ -1159,14 +1165,18 @@ class FileType(object):
# all other arguments are used as file names
try:
return open(string, self._mode, self._bufsize)
return open(string, self._mode, self._bufsize, self._encoding,
self._errors)
except IOError as e:
message = _("can't open '%s': %s")
raise ArgumentTypeError(message % (string, e))
def __repr__(self):
args = self._mode, self._bufsize
args_str = ', '.join(repr(arg) for arg in args if arg != -1)
kwargs = [('encoding', self._encoding), ('errors', self._errors)]
args_str = ', '.join([repr(arg) for arg in args if arg != -1] +
['%s=%r' % (kw, arg) for kw, arg in kwargs
if arg is not None])
return '%s(%s)' % (type(self).__name__, args_str)
# ===========================