mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
Issue #6095: Make directory argument to os.listdir optional.
Patch by Virgil Dupras.
This commit is contained in:
parent
e186e384f4
commit
c9e1c7d97f
4 changed files with 35 additions and 14 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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'):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue