diff options
author | Pauli Virtanen <pav@iki.fi> | 2010-04-04 20:20:56 +0000 |
---|---|---|
committer | Pauli Virtanen <pav@iki.fi> | 2010-04-04 20:20:56 +0000 |
commit | b5967d0073b6eb2305ccfec07809e48d4134d7b4 (patch) | |
tree | 7576796679270955ce0c55aedb5c5bf2cbefe5dc /numpy/core/_internal.py | |
parent | 8371b7563102ab5021d024a60669d926d4c577a6 (diff) | |
download | numpy-b5967d0073b6eb2305ccfec07809e48d4134d7b4.tar.gz |
ENH: core: improve parsing of byte order from PEP 3118 format strings
Diffstat (limited to 'numpy/core/_internal.py')
-rw-r--r-- | numpy/core/_internal.py | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/numpy/core/_internal.py b/numpy/core/_internal.py index 49216c646..9463b5099 100644 --- a/numpy/core/_internal.py +++ b/numpy/core/_internal.py @@ -436,8 +436,10 @@ def _dtype_from_pep3118(spec, byteorder='@', is_subdtype=False): spec = spec[j+1:] # Byte order - if spec[0] in ('@', '=', '<', '>', '^'): + if spec[0] in ('@', '=', '<', '>', '^', '!'): byteorder = spec[0] + if byteorder == '!': + byteorder = '>' spec = spec[1:] # Byte order characters also control native vs. standard type sizes @@ -462,10 +464,10 @@ def _dtype_from_pep3118(spec, byteorder='@', is_subdtype=False): is_padding = False if spec[:2] == 'T{': - value, spec, align = _dtype_from_pep3118(spec[2:], - byteorder=byteorder, - is_subdtype=True) + value, spec, align, next_byteorder = _dtype_from_pep3118( + spec[2:], byteorder=byteorder, is_subdtype=True) elif spec[0] in type_map_chars: + next_byteorder = byteorder if spec[0] == 'Z': j = 2 else: @@ -533,6 +535,8 @@ def _dtype_from_pep3118(spec, byteorder='@', is_subdtype=False): next_dummy_name() last_offset = offset + byteorder = next_byteorder + offset += value.itemsize offset += extra_offset @@ -541,13 +545,14 @@ def _dtype_from_pep3118(spec, byteorder='@', is_subdtype=False): name = get_dummy_name() fields[name] = ('V%d' % (offset - last_offset), last_offset) - if len(fields.keys()) == 1 and not explicit_name and fields['f0'][1] == 0: + if len(fields.keys()) == 1 and not explicit_name and fields['f0'][1] == 0 \ + and not is_subdtype: ret = fields['f0'][0] else: ret = dtype(fields) if is_subdtype: - return ret, spec, common_alignment + return ret, spec, common_alignment, byteorder else: return ret |