Skip to content

Commit 1fe0df7

Browse files
authored
[ENH] Improve str2bool + doctests
While addressing other issues I had to write some improvements to this little utility. I thought it was worth a separate, quick PR
1 parent 22451dd commit 1fe0df7

File tree

1 file changed

+35
-8
lines changed

1 file changed

+35
-8
lines changed

nipype/utils/misc.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
"""
66
from __future__ import (print_function, unicode_literals, division,
77
absolute_import)
8-
from builtins import next, str
8+
from builtins import next, bytes, str
99

1010
import os
1111
import sys
@@ -192,15 +192,42 @@ def package_check(pkg_name,
192192

193193

194194
def str2bool(v):
195+
"""
196+
Convert strings (and bytearrays) to boolean values
197+
198+
>>> all([str2bool(v) for v in (True, "yes", "true",
199+
... "t", "Yes", "True", "1", "on", "On")])
200+
True
201+
>>> all([str2bool(v.encode('utf-8'))
202+
... for v in ("yes", "true", "t", "1", "Yes", "on", "On")])
203+
True
204+
>>> any([str2bool(v) for v in (False, "no", "false", "n", "f",
205+
... "False", "0", "off", "Off")])
206+
False
207+
>>> any([str2bool(v.encode('utf-8'))
208+
... for v in ("no", "false", "n", "f", "0", "off", "Off")])
209+
False
210+
>>> any([str2bool(v) for v in (None, '/some/path', 'Agg', 'INFO',
211+
... '/some/bytes/path'.encode('utf-8'))]) # doctest: +ELLIPSIS
212+
Traceback (most recent call last):
213+
...
214+
ValueError: ...
215+
216+
"""
195217
if isinstance(v, bool):
196218
return v
197-
lower = v.lower()
198-
if lower in ("yes", "true", "t", "1"):
199-
return True
200-
elif lower in ("no", "false", "n", "f", "0"):
201-
return False
202-
else:
203-
raise ValueError("%s cannot be converted to bool" % v)
219+
220+
if isinstance(v, bytes):
221+
v = v.decode('utf-8')
222+
223+
if isinstance(v, str):
224+
lower = v.lower()
225+
if lower in ("yes", "true", "t", "1", "on"):
226+
return True
227+
elif lower in ("no", "false", "n", "f", "0", "off"):
228+
return False
229+
230+
raise ValueError("%r cannot be converted to bool" % v)
204231

205232

206233
def flatten(S):

0 commit comments

Comments
 (0)