From: Michael F. <fuz...@vo...> - 2012-04-01 22:43:38
|
On 31 Mar 2012, at 19:00, Faheem Mitha wrote: > > Hi > > I'm trying to use configobj's validate module to validate and convert > a list of lists of integers. > > However, it is not working. The value is > > model = [[5, 6], [7, 13, 18], [9, 22], [10, 12], [15, 16, 17], [20, 21]] > > I call the validation like > > model = check_list_of_list_of_integers > > Here is the check function and the error below. > > ##################################################################### > > def list_of_list_of_integers(value): > print "value", value > print "type(value)", type(value) > l = eval(value) > try: > list(l) > except: > raise "error" > return l > > fdict = {'check_list_of_list_of_integers': list_of_list_of_integers} > validator = validate.Validator(fdict) > > ###################################################################### > > I'm calling 'eval' on the value, which might not be the best idea, but > should work if the value is a string. However, the value is converted > to a list of strings on entrance to the "list_of_list_of_integers" > function, even though I have not asked for it to be so converted. > > Any idea what is going on and how I can fix this? > > Please CC me on any reply. Thanks. > > Regards, Faheem Mitha > > > value ['[[5', '6]', '[7', '13', '18]', '[9', '22]', '[10', '12]', '[15', > '16', '17]', '[20', '21]]'] > type(value) <type 'list'> > Traceback (most recent call last): > File "load_crossval.py", line 29, in <module> > conf = get_conf() > File "/home/faheem/corrmodel/utils.py", line 70, in get_conf > results = config.validate(validator, preserve_errors=True) > File "/usr/lib/pymodules/python2.6/configobj.py", line 2295, in validate > check = self.validate(validator, preserve_errors=preserve_errors, > copy=copy, section=section[entry]) > File "/usr/lib/pymodules/python2.6/configobj.py", line 2251, in validate > missing, ret_true, ret_false) > File "/usr/lib/pymodules/python2.6/configobj.py", line 2190, in > validate_entry > missing=missing > File "/usr/lib/pymodules/python2.6/validate.py", line 597, in check > return self._check_value(value, fun_name, fun_args, fun_kwargs) > File "/usr/lib/pymodules/python2.6/validate.py", line 629, in > _check_value > return fun(value, *fun_args, **fun_kwargs) > File "/home/faheem/corrmodel/utils.py", line 46, in > list_of_list_of_integers > l = eval(value) > TypeError: eval() arg 1 must be a string or code object > Yep, validate gets passed lists already separated. For lists of lists you need to effectively eval each list. However there are risks with eval that have already been explained. One solution, possible on Python 2.6 and more recent I believe, is use ast.literal_eval which works the same as eval for the basic types without code injection risks. All the best, Michael Foord > ------------------------------------------------------------------------------ > This SF email is sponsosred by: > Try Windows Azure free for 90 days Click Here > http://p.sf.net/sfu/sfd2d-msazure > _______________________________________________ > Configobj-develop mailing list > Con...@li... > https://lists.sourceforge.net/lists/listinfo/configobj-develop > -- http://www.voidspace.org.uk/ May you do good and not evil May you find forgiveness for yourself and forgive others May you share freely, never taking more than you give. -- the sqlite blessing http://www.sqlite.org/different.html |