@@ -48,42 +48,58 @@ def from_str(string):
4848 end_delims = (')' , ']' , '}' , '>' )
4949
5050 string = string .strip ()
51- if any ([c in string for c in beg_delims + end_delims ]) or ',' in string :
52- if string [0 ] in beg_delims :
53- string = string [1 :]
54- if string [- 1 ] in end_delims :
55- string = string [:- 1 ]
56- val = []
57- n_beg = 0
58- n_end = 0
59- elem_str = ''
60- for char in string :
61- if char in beg_delims :
62- n_beg += 1
63- elif char in end_delims :
64- n_end += 1
65-
66- if (char == ',' ) and n_beg == n_end :
67- val .append (from_str (elem_str .strip ()))
68- elem_str = ''
69- else :
70- elem_str += char
71- val .append (from_str (elem_str .strip ()))
72- return val
51+ has_delims = False
52+ for beg , end in zip (beg_delims , end_delims ):
53+ has_beg = string .startswith (beg )
54+ has_end = string .endswith (end )
55+ has_delims |= has_beg and has_end
56+ if has_delims or ',' in string :
57+ val = _list_from_str (string , beg_delims , end_delims )
7358 else :
59+ val = _single_from_str (string )
60+ return val
61+
62+
63+ def _list_from_str (string , beg_delims , end_delims ):
64+ if string [0 ] in beg_delims :
65+ string = string [1 :]
66+ if string [- 1 ] in end_delims :
67+ string = string [:- 1 ]
68+ val = []
69+ n_beg = 0
70+ n_end = 0
71+ elem_str = ''
72+ for char in string :
73+ if char in beg_delims :
74+ n_beg += 1
75+ elif char in end_delims :
76+ n_end += 1
77+
78+ if (char == ',' ) and n_beg == n_end :
79+ val .append (from_str (elem_str .strip ()))
80+ elem_str = ''
81+ else :
82+ elem_str += char
83+ if elem_str == string and ',' in string :
84+ return _single_from_str (string )
85+ val .append (from_str (elem_str .strip ()))
86+ return val
87+
88+
89+ def _single_from_str (string ):
90+ try :
91+ val = int (string )
92+ except ValueError :
7493 try :
75- val = int (string )
94+ val = float (string )
7695 except ValueError :
77- try :
78- val = float (string )
79- except ValueError :
80- if string .lower () in ('true' , 'yes' ):
81- val = True
82- elif string .lower () in ('false' , 'no' ):
83- val = False
84- else :
85- val = str (string )
86- return val
96+ if string .lower () in ('true' , 'yes' ):
97+ val = True
98+ elif string .lower () in ('false' , 'no' ):
99+ val = False
100+ else :
101+ val = str (string )
102+ return val
87103
88104
89105# --------------------------------------------------------------------------- #
0 commit comments