5
5
import ast
6
6
from typing import Optional
7
7
8
+ def _find_closing_bracket_position (string ):
9
+ stack = 0
10
+ for i , char in enumerate (string ):
11
+ if char == '[' :
12
+ stack += 1
13
+ elif char == ']' :
14
+ stack -= 1
15
+ if stack == 0 :
16
+ return i
17
+ raise ValueError # If there is no closing bracket
18
+
19
+ def _find_closing_parenthesis_position (string ):
20
+ stack = 0
21
+ for i , char in enumerate (string ):
22
+ if char == '(' :
23
+ stack += 1
24
+ elif char == ')' :
25
+ stack -= 1
26
+ if stack == 0 :
27
+ return i
28
+ raise ValueError # If there is no closing parenthesis
29
+
8
30
def _parse_with_pint (string : str ):
9
31
""" Parses a string and returns a pint quantity.
10
32
@@ -19,13 +41,22 @@ def _parse_with_pint(string: str):
19
41
A pint quantity.
20
42
"""
21
43
# Check if it's a non scalar quantity
22
- if string .startswith ('[' ) or string . startswith ( '(' ) :
44
+ if string .startswith ('[' ):
23
45
24
- end_list = max (string . rfind ( ')' ) + 1 , string . rfind ( ']' ) + 1 )
25
- value_string = string [:end_list ]
26
- unit_string = string [end_list :]
46
+ end_list = _find_closing_bracket_position (string )
47
+ value_string = string [:( end_list + 1 ) ]
48
+ unit_string = string [( end_list + 1 ) :]
27
49
28
50
return ast .literal_eval (value_string )* dict_translate_quantity ['string' ]['pint' ](unit_string )
51
+
52
+ elif string .startswith ('(' ):
53
+
54
+ end_list = _find_closing_parenthesis_position (string )
55
+ value_string = string [:(end_list + 1 )]
56
+ unit_string = string [(end_list + 1 ):]
57
+
58
+ return ast .literal_eval (value_string )* dict_translate_quantity ['string' ]['pint' ](unit_string )
59
+
29
60
else :
30
61
return dict_translate_quantity ['string' ]['pint' ](string )
31
62
0 commit comments