summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2010-07-23 12:16:41 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2010-07-23 12:16:41 (GMT)
commitc9e1c7d97f97a4aa18b984bb62dedaf6bb5aa251 (patch)
treea221da32da6cec2c5e088e1b56586f3cf6304a79
parente186e384f4fb11158b448d94f37aaf2a3ed6b45e (diff)
downloadcpython-c9e1c7d97f97a4aa18b984bb62dedaf6bb5aa251.zip
cpython-c9e1c7d97f97a4aa18b984bb62dedaf6bb5aa251.tar.gz
cpython-c9e1c7d97f97a4aa18b984bb62dedaf6bb5aa251.tar.bz2
Issue #6095: Make directory argument to os.listdir optional.
Patch by Virgil Dupras.
-rw-r--r--Doc/library/os.rst6
-rw-r--r--Lib/test/test_posix.py11
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/posixmodule.c30
4 files changed, 35 insertions, 14 deletions
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 9167b30..a4dec4c 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -1049,10 +1049,10 @@ Files and Directories
Availability: Unix.
-.. function:: listdir(path)
+.. function:: listdir([path])
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.
This function can be called with a bytes or string argument, and returns
@@ -1060,6 +1060,8 @@ Files and Directories
Availability: Unix, Windows.
+ .. versionchanged:: 3.2
+ The *path* parameter became optional.
.. function:: lstat(path)
diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py
index cbc786c..ab78ab6 100644
--- a/Lib/test/test_posix.py
+++ b/Lib/test/test_posix.py
@@ -252,9 +252,14 @@ class PosixTester(unittest.TestCase):
posix.chdir(os.curdir)
self.assertRaises(OSError, posix.chdir, support.TESTFN)
- def test_lsdir(self):
- if hasattr(posix, 'lsdir'):
- self.assertIn(support.TESTFN, posix.lsdir(os.curdir))
+ def test_listdir(self):
+ if hasattr(posix, 'listdir'):
+ 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):
if hasattr(posix, 'access'):
diff --git a/Misc/NEWS b/Misc/NEWS
index 0bc66e8..8ef64e8 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1440,6 +1440,8 @@ Library
Extension Modules
-----------------
+- Issue #6095: Make directory argument to os.listdir optional.
+
- Issue #9277: Fix bug in struct.pack for bools in standard mode
(e.g., struct.pack('>?')): if conversion to bool raised an exception
then that exception wasn't properly propagated on machines where
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 8e7f2ff..c09bcb0 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -2291,10 +2291,10 @@ posix_link(PyObject *self, PyObject *args)
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\
\n\
- path: path of directory to list\n\
+ path: path of directory to list (default: '.')\n\
\n\
The list is in arbitrary order. It does not include the special\n\
entries '.' and '..' even if they are present in the directory.");
@@ -2315,18 +2315,25 @@ posix_listdir(PyObject *self, PyObject *args)
char *bufptr = namebuf;
Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
- PyObject *po;
- if (PyArg_ParseTuple(args, "U:listdir", &po)) {
+ PyObject *po = NULL;
+ if (PyArg_ParseTuple(args, "|U:listdir", &po)) {
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 */
- len = PyUnicode_GET_SIZE(po);
wnamebuf = malloc((len + 5) * sizeof(wchar_t));
if (!wnamebuf) {
PyErr_NoMemory();
return NULL;
}
- wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po));
+ wcscpy(wnamebuf, po_wchars);
if (len > 0) {
Py_UNICODE wch = wnamebuf[len-1];
if (wch != L'/' && wch != L'\\' && wch != L':')
@@ -2548,12 +2555,17 @@ posix_listdir(PyObject *self, PyObject *args)
int arg_is_unicode = 1;
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;
PyErr_Clear();
}
- if (!PyArg_ParseTuple(args, "O&:listdir", PyUnicode_FSConverter, &oname))
+ oname = NULL;
+ if (!PyArg_ParseTuple(args, "|O&:listdir", PyUnicode_FSConverter, &oname))
return NULL;
+ if (oname == NULL) { // Default arg: "."
+ oname = PyBytes_FromString(".");
+ }
name = PyBytes_AsString(oname);
if ((dirp = opendir(name)) == NULL) {
return posix_error_with_allocated_filename(oname);