Issue #6095: Make directory argument to os.listdir optional.

Patch by Virgil Dupras.
This commit is contained in:
Martin v. Löwis 2010-07-23 12:16:41 +00:00
parent e186e384f4
commit c9e1c7d97f
4 changed files with 35 additions and 14 deletions

View file

@ -1049,10 +1049,10 @@ Files and Directories
Availability: Unix. Availability: Unix.
.. function:: listdir(path) .. function:: listdir([path])
Return a list containing the names of the entries in the directory given by Return a list containing the names of the entries in the directory given by
*path*. The list is in arbitrary order. It does not include the special *path* (default: '.'). The list is in arbitrary order. It does not include the special
entries ``'.'`` and ``'..'`` even if they are present in the directory. entries ``'.'`` and ``'..'`` even if they are present in the directory.
This function can be called with a bytes or string argument, and returns This function can be called with a bytes or string argument, and returns
@ -1060,6 +1060,8 @@ Files and Directories
Availability: Unix, Windows. Availability: Unix, Windows.
.. versionchanged:: 3.2
The *path* parameter became optional.
.. function:: lstat(path) .. function:: lstat(path)

View file

@ -252,9 +252,14 @@ class PosixTester(unittest.TestCase):
posix.chdir(os.curdir) posix.chdir(os.curdir)
self.assertRaises(OSError, posix.chdir, support.TESTFN) self.assertRaises(OSError, posix.chdir, support.TESTFN)
def test_lsdir(self): def test_listdir(self):
if hasattr(posix, 'lsdir'): if hasattr(posix, 'listdir'):
self.assertIn(support.TESTFN, posix.lsdir(os.curdir)) self.assertTrue(support.TESTFN in posix.listdir(os.curdir))
def test_listdir_default(self):
# When listdir is called without argument, it's the same as listdir(os.curdir)
if hasattr(posix, 'listdir'):
self.assertTrue(support.TESTFN in posix.listdir())
def test_access(self): def test_access(self):
if hasattr(posix, 'access'): if hasattr(posix, 'access'):

View file

@ -1440,6 +1440,8 @@ Library
Extension Modules Extension Modules
----------------- -----------------
- Issue #6095: Make directory argument to os.listdir optional.
- Issue #9277: Fix bug in struct.pack for bools in standard mode - Issue #9277: Fix bug in struct.pack for bools in standard mode
(e.g., struct.pack('>?')): if conversion to bool raised an exception (e.g., struct.pack('>?')): if conversion to bool raised an exception
then that exception wasn't properly propagated on machines where then that exception wasn't properly propagated on machines where

View file

@ -2291,10 +2291,10 @@ posix_link(PyObject *self, PyObject *args)
PyDoc_STRVAR(posix_listdir__doc__, PyDoc_STRVAR(posix_listdir__doc__,
"listdir(path) -> list_of_strings\n\n\ "listdir([path]) -> list_of_strings\n\n\
Return a list containing the names of the entries in the directory.\n\ Return a list containing the names of the entries in the directory.\n\
\n\ \n\
path: path of directory to list\n\ path: path of directory to list (default: '.')\n\
\n\ \n\
The list is in arbitrary order. It does not include the special\n\ The list is in arbitrary order. It does not include the special\n\
entries '.' and '..' even if they are present in the directory."); entries '.' and '..' even if they are present in the directory.");
@ -2315,18 +2315,25 @@ posix_listdir(PyObject *self, PyObject *args)
char *bufptr = namebuf; char *bufptr = namebuf;
Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */ Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
PyObject *po; PyObject *po = NULL;
if (PyArg_ParseTuple(args, "U:listdir", &po)) { if (PyArg_ParseTuple(args, "|U:listdir", &po)) {
WIN32_FIND_DATAW wFileData; WIN32_FIND_DATAW wFileData;
Py_UNICODE *wnamebuf; Py_UNICODE *wnamebuf, *po_wchars;
if (po == NULL) { // Default arg: "."
po_wchars = L".";
len = 1;
} else {
po_wchars = PyUnicode_AS_UNICODE(po);
len = PyUnicode_GET_SIZE(po);
}
/* Overallocate for \\*.*\0 */ /* Overallocate for \\*.*\0 */
len = PyUnicode_GET_SIZE(po);
wnamebuf = malloc((len + 5) * sizeof(wchar_t)); wnamebuf = malloc((len + 5) * sizeof(wchar_t));
if (!wnamebuf) { if (!wnamebuf) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
} }
wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po)); wcscpy(wnamebuf, po_wchars);
if (len > 0) { if (len > 0) {
Py_UNICODE wch = wnamebuf[len-1]; Py_UNICODE wch = wnamebuf[len-1];
if (wch != L'/' && wch != L'\\' && wch != L':') if (wch != L'/' && wch != L'\\' && wch != L':')
@ -2548,12 +2555,17 @@ posix_listdir(PyObject *self, PyObject *args)
int arg_is_unicode = 1; int arg_is_unicode = 1;
errno = 0; errno = 0;
if (!PyArg_ParseTuple(args, "U:listdir", &v)) { /* v is never read, so it does not need to be initialized yet. */
if (!PyArg_ParseTuple(args, "|U:listdir", &v)) {
arg_is_unicode = 0; arg_is_unicode = 0;
PyErr_Clear(); PyErr_Clear();
} }
if (!PyArg_ParseTuple(args, "O&:listdir", PyUnicode_FSConverter, &oname)) oname = NULL;
if (!PyArg_ParseTuple(args, "|O&:listdir", PyUnicode_FSConverter, &oname))
return NULL; return NULL;
if (oname == NULL) { // Default arg: "."
oname = PyBytes_FromString(".");
}
name = PyBytes_AsString(oname); name = PyBytes_AsString(oname);
if ((dirp = opendir(name)) == NULL) { if ((dirp = opendir(name)) == NULL) {
return posix_error_with_allocated_filename(oname); return posix_error_with_allocated_filename(oname);