summaryrefslogtreecommitdiff
path: root/numpy/core/_internal.py
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2010-04-04 20:20:56 +0000
committerPauli Virtanen <pav@iki.fi>2010-04-04 20:20:56 +0000
commitb5967d0073b6eb2305ccfec07809e48d4134d7b4 (patch)
tree7576796679270955ce0c55aedb5c5bf2cbefe5dc /numpy/core/_internal.py
parent8371b7563102ab5021d024a60669d926d4c577a6 (diff)
downloadnumpy-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.py17
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