changeset: 78257:03063e718f5f parent: 78254:db0973994844 parent: 78256:3e7b517e1b68 user: Meador Inge date: Mon Jul 23 10:22:36 2012 -0500 files: Lib/test/test_struct.py Misc/NEWS Modules/_struct.c description: Issue #15402: Add a __sizeof__ method to struct.Struct. Initial patch by Serhiy Storchaka. diff -r db0973994844 -r 03063e718f5f Lib/test/test_struct.py --- a/Lib/test/test_struct.py Mon Jul 23 09:16:53 2012 -0500 +++ b/Lib/test/test_struct.py Mon Jul 23 10:22:36 2012 -0500 @@ -572,6 +572,16 @@ s = struct.Struct('i') s.__init__('ii') + def test_sizeof(self): + self.assertGreater(sys.getsizeof(struct.Struct('BHILfdspP')), + sys.getsizeof(struct.Struct('B'))) + self.assertGreaterEqual(sys.getsizeof(struct.Struct('123B')), + sys.getsizeof(struct.Struct('B'))) + self.assertGreaterEqual(sys.getsizeof(struct.Struct('B' * 123)), + sys.getsizeof(struct.Struct('123B'))) + self.assertGreaterEqual(sys.getsizeof(struct.Struct('123xB')), + sys.getsizeof(struct.Struct('B'))) + def test_main(): run_unittest(StructTest) diff -r db0973994844 -r 03063e718f5f Misc/NEWS --- a/Misc/NEWS Mon Jul 23 09:16:53 2012 -0500 +++ b/Misc/NEWS Mon Jul 23 10:22:36 2012 -0500 @@ -52,6 +52,10 @@ Library ------- +- Issue #15402: An issue in the struct module that caused sys.getsizeof to + return incorrect results for struct.Struct instances has been fixed. + Initial patch by Serhiy Storchaka. + - Issue #15232: when mangle_from is True, email.Generator now correctly mangles lines that start with 'From' that occur in a MIME preamble or epilogue. diff -r db0973994844 -r 03063e718f5f Modules/_struct.c --- a/Modules/_struct.c Mon Jul 23 09:16:53 2012 -0500 +++ b/Modules/_struct.c Mon Jul 23 10:22:36 2012 -0500 @@ -1752,6 +1752,22 @@ return PyLong_FromSsize_t(self->s_size); } +PyDoc_STRVAR(s_sizeof__doc__, +"S.__sizeof__() -> size of S in memory, in bytes"); + +static PyObject * +s_sizeof(PyStructObject *self) +{ + Py_ssize_t size; + formatcode *code; + + size = sizeof(PyStructObject) + sizeof(formatcode); + for (code = self->s_codes; code->fmtdef != NULL; code++) { + size += sizeof(formatcode); + } + return PyLong_FromSsize_t(size); +} + /* List of functions */ static struct PyMethodDef s_methods[] = { @@ -1760,6 +1776,7 @@ {"unpack", s_unpack, METH_O, s_unpack__doc__}, {"unpack_from", (PyCFunction)s_unpack_from, METH_VARARGS|METH_KEYWORDS, s_unpack_from__doc__}, + {"__sizeof__", (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__}, {NULL, NULL} /* sentinel */ };

AltStyle によって変換されたページ (->オリジナル) /