@@ -470,25 +470,9 @@ def __dtype_from_pep3118(stream, is_subdtype):
470
470
itemsize = 0
471
471
)
472
472
offset = 0
473
- explicit_name = False
474
- this_explicit_name = False
475
473
common_alignment = 1
476
474
is_padding = False
477
475
478
- dummy_name_index = [0 ]
479
-
480
-
481
- def next_dummy_name ():
482
- dummy_name_index [0 ] += 1
483
-
484
- def get_dummy_name ():
485
- while True :
486
- name = 'f%d' % dummy_name_index [0 ]
487
- if name not in field_spec ['names' ]:
488
- return name
489
- next_dummy_name ()
490
-
491
-
492
476
# Parse spec
493
477
while stream :
494
478
value = None
@@ -583,25 +567,19 @@ def get_dummy_name():
583
567
value = dtype ((value , shape ))
584
568
585
569
# Field name
586
- this_explicit_name = False
587
570
if stream .consume (':' ):
588
571
name = stream .consume_until (':' )
589
- explicit_name = True
590
- this_explicit_name = True
591
572
else :
592
- name = get_dummy_name ()
573
+ name = None
593
574
594
- if not is_padding or this_explicit_name :
595
- if name in field_spec ['names' ]:
575
+ if not ( is_padding and name is None ) :
576
+ if name is not None and name in field_spec ['names' ]:
596
577
raise RuntimeError ("Duplicate field name '%s' in PEP3118 format"
597
578
% name )
598
579
field_spec ['names' ].append (name )
599
580
field_spec ['formats' ].append (value )
600
581
field_spec ['offsets' ].append (offset )
601
582
602
- if not this_explicit_name :
603
- next_dummy_name ()
604
-
605
583
offset += value .itemsize
606
584
offset += extra_offset
607
585
@@ -612,18 +590,33 @@ def get_dummy_name():
612
590
field_spec ['itemsize' ] += (- offset ) % common_alignment
613
591
614
592
# Check if this was a simple 1-item type, and unwrap it
615
- if (len ( field_spec ['names' ]) == 1
593
+ if (field_spec ['names' ] == [ None ]
616
594
and field_spec ['offsets' ][0 ] == 0
617
595
and field_spec ['itemsize' ] == field_spec ['formats' ][0 ].itemsize
618
- and not explicit_name
619
596
and not is_subdtype ):
620
597
ret = field_spec ['formats' ][0 ]
621
598
else :
599
+ _fix_names (field_spec )
622
600
ret = dtype (field_spec )
623
601
624
602
# Finished
625
603
return ret , common_alignment
626
604
605
+ def _fix_names (field_spec ):
606
+ """ Replace names which are None with the next unused f%d name """
607
+ names = field_spec ['names' ]
608
+ for i , name in enumerate (names ):
609
+ if name is not None :
610
+ continue
611
+
612
+ j = 0
613
+ while True :
614
+ name = 'f{}' .format (j )
615
+ if name not in names :
616
+ break
617
+ j = j + 1
618
+ names [i ] = name
619
+
627
620
def _add_trailing_padding (value , padding ):
628
621
"""Inject the specified number of padding bytes at the end of a dtype"""
629
622
if value .fields is None :
0 commit comments