human
Complete this python program:
def _extractall(self, path='.', members=None):
assistant
#Here is the Python program you requested.

    """Extract all members from the archive to the current working
    directory and set owner, modification time and permissions on
    directories afterwards. `path\ specifies a different directory
    to extract to. `members\ is optional and must be a subset of the
    list returned by getmembers().
    """
    import copy
    import operator
    from tarfile import ExtractError
    directories = []
    if (members is None):
        members = self
    for tarinfo in members:
        if tarinfo.isdir():
            directories.append(tarinfo)
            tarinfo = copy.copy(tarinfo)
            tarinfo.mode = 448
        self.extract(tarinfo, path)
    if (sys.version_info < (2, 4)):
        def sorter(dir1, dir2):
            return cmp(dir1.name, dir2.name)
        directories.sort(sorter)
        directories.reverse()
    else:
        directories.sort(key=operator.attrgetter('name'), reverse=True)
    for tarinfo in directories:
        dirpath = os.path.join(path, tarinfo.name)
        try:
            self.chown(tarinfo, dirpath)
            self.utime(tarinfo, dirpath)
            self.chmod(tarinfo, dirpath)
        except ExtractError:
            e = sys.exc_info()[1]
            if (self.errorlevel > 1):
                raise
            else:
                self._dbg(1, ('tarfile:    %s' % e))