diff -r bc5f257f5cc1 Lib/test/test_structseq.py --- a/Lib/test/test_structseq.py Sun Jan 12 14:12:59 2014 -0800 +++ b/Lib/test/test_structseq.py Sun Jan 12 16:31:15 2014 -0800 @@ -28,6 +28,16 @@ for i in range(-len(t), len(t)-1): self.assertEqual(t[i], astuple[i]) + def test_fields(self): + t = time.gmtime() + self.assertEqual(t._fields, + ('tm_year', 'tm_mon', 'tm_mday', 'tm_hour', 'tm_min', + 'tm_sec', 'tm_wday', 'tm_yday', 'tm_isdst')) + st = os.stat(__file__) + self.assertIn("st_mode", st._fields) + self.assertIn("st_ino", st._fields) + self.assertIn("st_dev", st._fields) + def test_repr(self): t = time.gmtime() self.assertTrue(repr(t)) diff -r bc5f257f5cc1 Objects/structseq.c --- a/Objects/structseq.c Sun Jan 12 14:12:59 2014 -0800 +++ b/Objects/structseq.c Sun Jan 12 16:31:15 2014 -0800 @@ -7,6 +7,7 @@ static char visible_length_key[] = "n_sequence_fields"; static char real_length_key[] = "n_fields"; static char unnamed_fields_key[] = "n_unnamed_fields"; +static char _fields_key[] = "_fields"; /* Fields with this name have only a field index, not a field name. They are only allowed for indices < n_visible_fields. */ @@ -14,6 +15,7 @@ _Py_IDENTIFIER(n_sequence_fields); _Py_IDENTIFIER(n_fields); _Py_IDENTIFIER(n_unnamed_fields); +_Py_IDENTIFIER(_fields); #define VISIBLE_SIZE(op) Py_SIZE(op) #define VISIBLE_SIZE_TP(tp) PyLong_AsLong( \ @@ -327,6 +329,7 @@ PyMemberDef* members; int n_members, n_unnamed_members, i, k; PyObject *v; + PyObject *_fields; #ifdef Py_TRACE_REFS /* if the type object was chained, unchain it first @@ -389,6 +392,19 @@ SET_DICT_FROM_INT(real_length_key, n_members); SET_DICT_FROM_INT(unnamed_fields_key, n_unnamed_members); + _fields = PyTuple_New(desc->n_in_sequence); + if (!_fields) + return -1; + for (i = 0; i != desc->n_in_sequence; ++i) { + PyObject *field = PyUnicode_FromString(members[i].name); + PyTuple_SET_ITEM(_fields, i, field); + } + if (PyDict_SetItemString(dict, _fields_key, _fields) < 0) { + Py_DECREF(_fields); + return -1; + } + Py_DECREF(_fields); + return 0; } @@ -417,7 +433,8 @@ { if (_PyUnicode_FromId(&PyId_n_sequence_fields) == NULL || _PyUnicode_FromId(&PyId_n_fields) == NULL - || _PyUnicode_FromId(&PyId_n_unnamed_fields) == NULL) + || _PyUnicode_FromId(&PyId_n_unnamed_fields) == NULL + || _PyUnicode_FromId(&PyId__fields) == NULL) return -1; return 0;