Skip to content

Commit a30b85d

Browse files
committed
RF - promote guessed_endian to public classmethod
Guessed endian needs to be written for each substantial subclass, so it should be part of the API. It makes more sense as a classmethod because we should not need an instance to test other data for endianness.
1 parent 07e2207 commit a30b85d

File tree

3 files changed

+22
-19
lines changed

3 files changed

+22
-19
lines changed

nibabel/analyze.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@ def __init__(self,
245245
'''
246246
super(AnalyzeHeader, self).__init__(binaryblock, endianness, check)
247247

248-
def _guessed_endian(self, hdr):
248+
@classmethod
249+
def guessed_endian(klass, hdr):
249250
''' Guess intended endianness from mapping-like ``hdr``
250251
251252
Parameters
@@ -264,19 +265,19 @@ def _guessed_endian(self, hdr):
264265
265266
>>> hdr = AnalyzeHeader()
266267
>>> hdr_data = np.zeros((), dtype=header_dtype)
267-
>>> hdr._guessed_endian(hdr_data) == native_code
268+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
268269
True
269270
270271
A valid native header is guessed native
271272
272273
>>> hdr_data = hdr.structarr.copy()
273-
>>> hdr._guessed_endian(hdr_data) == native_code
274+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
274275
True
275276
276277
And, when swapped, is guessed as swapped
277278
278279
>>> sw_hdr_data = hdr_data.byteswap(swapped_code)
279-
>>> hdr._guessed_endian(sw_hdr_data) == swapped_code
280+
>>> AnalyzeHeader.guessed_endian(sw_hdr_data) == swapped_code
280281
True
281282
282283
The algorithm is as follows:
@@ -287,13 +288,13 @@ def _guessed_endian(self, hdr):
287288
288289
>>> hdr_data = np.zeros((), dtype=header_dtype) # blank binary data
289290
>>> hdr_data['dim'][0] = 1
290-
>>> hdr._guessed_endian(hdr_data) == native_code
291+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
291292
True
292293
>>> hdr_data['dim'][0] = 6
293-
>>> hdr._guessed_endian(hdr_data) == native_code
294+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
294295
True
295296
>>> hdr_data['dim'][0] = -1
296-
>>> hdr._guessed_endian(hdr_data) == swapped_code
297+
>>> AnalyzeHeader.guessed_endian(hdr_data) == swapped_code
297298
True
298299
299300
If the first ``dim`` value is zeros, we need a tie breaker.
@@ -302,20 +303,20 @@ def _guessed_endian(self, hdr):
302303
assumed swapped. Otherwise assume native.
303304
304305
>>> hdr_data = np.zeros((), dtype=header_dtype) # blank binary data
305-
>>> hdr._guessed_endian(hdr_data) == native_code
306+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
306307
True
307308
>>> hdr_data['sizeof_hdr'] = 1543569408
308-
>>> hdr._guessed_endian(hdr_data) == swapped_code
309+
>>> AnalyzeHeader.guessed_endian(hdr_data) == swapped_code
309310
True
310311
>>> hdr_data['sizeof_hdr'] = -1
311-
>>> hdr._guessed_endian(hdr_data) == native_code
312+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
312313
True
313314
314315
This is overridden by the ``dim``[0] value though:
315316
316317
>>> hdr_data['sizeof_hdr'] = 1543569408
317318
>>> hdr_data['dim'][0] = 1
318-
>>> hdr._guessed_endian(hdr_data) == native_code
319+
>>> AnalyzeHeader.guessed_endian(hdr_data) == native_code
319320
True
320321
'''
321322
dim0 = int(hdr['dim'][0])

nibabel/tests/test_wrapstruct.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
This is a root testing class, used in the Analyze and other tests as a
1212
framework for all the tests common to the Analyze types
1313
14-
Refactoring TODO
15-
----------------
14+
Refactoring TODO maybe
15+
----------------------
1616
1717
binaryblock
1818
diagnose_binaryblock
@@ -21,7 +21,6 @@
2121
2222
With deprecation warnings
2323
24-
_guessed_endian -> guessed_endian
2524
_field_recoders -> field_recoders
2625
'''
2726
import logging
@@ -53,7 +52,8 @@ class MyWrapStruct(WrapStruct):
5352
('a_str', 'S10')]
5453
_dtype = np.dtype(dtype_def)
5554

56-
def _guessed_endian(self, hdr):
55+
@classmethod
56+
def guessed_endian(klass, hdr):
5757
if hdr['an_integer'] < 256:
5858
return native_code
5959
return swapped_code

nibabel/wrapstruct.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ def __init__(self,
155155
dtype=self._dtype,
156156
buffer=binaryblock)
157157
if endianness is None:
158-
endianness = self._guessed_endian(wstr)
158+
endianness = self.__class__.guessed_endian(wstr)
159159
else:
160160
endianness = endian_codes[endianness]
161161
if endianness != native_code:
@@ -352,13 +352,15 @@ def diagnose_binaryblock(klass, binaryblock, endianness=None):
352352
return '\n'.join([report.message
353353
for report in reports if report.message])
354354

355-
def _guessed_endian(self, wstr):
356-
''' Guess intended endianness from mapping-like ``wstr``
355+
@classmethod
356+
def guessed_endian(self, mapping):
357+
''' Guess intended endianness from mapping-like ``mapping``
357358
358359
Parameters
359360
----------
360361
wstr : mapping-like
361-
wstr for which to guess endianness
362+
Something implementing a mapping. We will guess the endianness from
363+
looking at the field values
362364
363365
Returns
364366
-------

0 commit comments

Comments
 (0)