[pypy-commit] pypy py3.5-time: introduce invisible fields, now the test_time.py suite passes

plan_rich pypy.commits at gmail.com
Tue Jan 3 09:46:18 EST 2017


Author: Richard Plangger <planrichi at gmail.com>
Branch: py3.5-time
Changeset: r89335:290ed01b7833
Date: 2017-01-03 15:45 +0100
http://bitbucket.org/pypy/pypy/changeset/290ed01b7833/

Log:	introduce invisible fields, now the test_time.py suite passes

diff --git a/lib_pypy/_structseq.py b/lib_pypy/_structseq.py
--- a/lib_pypy/_structseq.py
+++ b/lib_pypy/_structseq.py
@@ -46,12 +46,16 @@
 
         extra_fields = sorted(fields_by_index.items())
         n_sequence_fields = 0
+        invis_fields = []
         if 'n_sequence_fields' in dict:
             n_sequence_fields = dict['n_sequence_fields']
             extra_fields = extra_fields[n_sequence_fields:]
             seq = n_sequence_fields
             # pop all fields that are still in sequence!
             while extra_fields and extra_fields[0][0] == seq:
+                field = extra_fields[0][1]
+                field.index = None
+                invis_fields.append(field)
                 extra_fields.pop(0)
                 seq += 1
         else:
@@ -68,6 +72,7 @@
 
         assert '__new__' not in dict
         dict['_extra_fields'] = tuple(extra_fields)
+        dict['_invis_fields'] = tuple(invis_fields)
         dict['__new__'] = structseq_new
         dict['__reduce__'] = structseq_reduce
         dict['__setattr__'] = structseq_setattr
@@ -101,7 +106,12 @@
                 msg = "exactly"
             raise TypeError("expected a sequence with %s %d items. has %d" \
                             % (msg, real_count, length))
-        for field, value in zip(cls._extra_fields, sequence[visible_count:]):
+        for field, value in zip(cls._invis_fields, sequence[visible_count:real_count]):
+            name = field.__name__
+            if name in dict:
+                raise TypeError("duplicate value for %r" % (name,))
+            dict[name] = value
+        for field, value in zip(cls._extra_fields, sequence[real_count:]):
             name = field.__name__
             if name in dict:
                 raise TypeError("duplicate value for %r" % (name,))


More information about the pypy-commit mailing list