Re: Is there a simple way to parse this string ?
Steven D'Aprano, On Dec 21, 2:08 am, Steven D'Aprano [EMAIL PROTECTED] wrote: On Thu, 20 Dec 2007 20:27:23 -0800, [EMAIL PROTECTED] wrote: Stef, For clarification, there is nothing hazardous about using eval on the string that you presented. t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8') Whether or not this is the simplest solution, remains a question. For clarification, if all the poster wanted was to convert the *specific* *known* string to a tuple, he would be better off just writing it as a tuple: Steven, No, that's not what he asked. Read the original question. t = (0, 0, 0, 255), (192, 192, 192, 255), True, 8 is much faster than calling eval(). But obviously that's not what the Original Poster wants to do. There's nothing Obviously Implied about what the author wants to do here, besides convert an innocent string object to a tuple. The tuple give was indicative of input that comes from somewhere Really? I personally can't tell that from his provided example. There's definitely not enough info on this one. -- perhaps a config file, perhaps a web form, perhaps a command line argument, who knows? The point is, if the string comes from a user, then it could contain anything: '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' '1000, 10001, 12, 104' 'foo bar baz.split()' '[i for i in range(10)]' '[19852.7412]*10**2' '__import__(os).system(ls -r *)' Just because the OP's specific example is safe doesn't make eval() safe. Agreed. And after the last couple comments, he was probably made aware of that. Thank you for reiterating :-) -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Sat, 22 Dec 2007 07:21:26 -0800, [EMAIL PROTECTED] wrote: Steven D'Aprano, On Dec 21, 2:08 am, Steven D'Aprano [EMAIL PROTECTED] wrote: On Thu, 20 Dec 2007 20:27:23 -0800, [EMAIL PROTECTED] wrote: Stef, For clarification, there is nothing hazardous about using eval on the string that you presented. t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8') Whether or not this is the simplest solution, remains a question. For clarification, if all the poster wanted was to convert the *specific* *known* string to a tuple, he would be better off just writing it as a tuple: Steven, No, that's not what he asked. Read the original question. I did. I even read all the way down to the part where he wrote: (Not needed now, but might need it in the future: even deeper nested lists, represented by a string.) Its clear that the OP has more in mind than just a single specific known string. -- Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Dec 19, 8:44 pm, Paul McGuire [EMAIL PROTECTED] wrote: I think the last thread of this nature also cited a similar tool by the effbot, which he describes here:http://www.effbot.org/zone/simple-iterator-parser.htm. This parser is about 10X faster than the equivalent pyparsing parser. Here's the relevant thread: http://preview.tinyurl.com/2aeswn. Note that the builtin eval() is around 5x faster than this parser, and from the statement above, 50x faster than the pyparsing solution. George -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
Stef, For clarification, there is nothing hazardous about using eval on the string that you presented. t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8') Whether or not this is the simplest solution, remains a question. -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Thu, 20 Dec 2007 20:27:23 -0800, [EMAIL PROTECTED] wrote: Stef, For clarification, there is nothing hazardous about using eval on the string that you presented. t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8') Whether or not this is the simplest solution, remains a question. For clarification, if all the poster wanted was to convert the *specific* *known* string to a tuple, he would be better off just writing it as a tuple: t = (0, 0, 0, 255), (192, 192, 192, 255), True, 8 is much faster than calling eval(). But obviously that's not what the Original Poster wants to do. The tuple give was indicative of input that comes from somewhere -- perhaps a config file, perhaps a web form, perhaps a command line argument, who knows? The point is, if the string comes from a user, then it could contain anything: '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' '1000, 10001, 12, 104' 'foo bar baz.split()' '[i for i in range(10)]' '[19852.7412]*10**2' '__import__(os).system(ls -r *)' Just because the OP's specific example is safe doesn't make eval() safe. -- Steven -- http://mail.python.org/mailman/listinfo/python-list
RE: Is there a simple way to parse this string ?
I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. Stef Mientki a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' b = eval(a) b ((0, 0, 0, 255), (192, 192, 192, 255), True, 8) c = list(eval(a)) c [(0, 0, 0, 255), (192, 192, 192, 255), True, 8] -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
Stef, You can quickly get a tuple via: t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8') Joseph Armbruster On Dec 19, 4:17 pm, Stef Mientki [EMAIL PROTECTED] wrote: hello, I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. (Not needed now, but might need it in the future: even deeper nested lists, represented by a string.) thanks, Stef Mientki -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
Stef Mientki wrote: hello, I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. (Not needed now, but might need it in the future: even deeper nested lists, represented by a string.) thanks, Stef Mientki There are threads on this list about eval and how you need to be careful. Make sure you know where the string is coming from and can control the contents. If you read if from a user they could type in: os.system('rm -rf *') or os.system('del *.*') eval that and it deletes all the files on your disk -Larry -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Dec 20, 9:10 am, Larry Bates [EMAIL PROTECTED] wrote: Stef Mientki wrote: hello, I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. (Not needed now, but might need it in the future: even deeper nested lists, represented by a string.) thanks, Stef Mientki There are threads on this list about eval and how you need to be careful. In particular Paul Maguire recently pointed to a safe evaluator that was restricted (IIRC) to something like lists/dicts/etc of ints/floats/ string/etc constants -- looks like just what you need. Make sure you know where the string is coming from and can control the contents. If you read if from a user they could type in: os.system('rm -rf *') or os.system('del *.*') eval that and it deletes all the files on your disk Does anyone know of a newsreader that can automatically killfile people who suggest eval without any warnings at all? Or should we let Darwinian selection take its effect? -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
En Wed, 19 Dec 2007 19:23:36 -0300, John Machin [EMAIL PROTECTED] escribió: On Dec 20, 9:10 am, Larry Bates [EMAIL PROTECTED] wrote: Stef Mientki wrote: I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. In particular Paul Maguire recently pointed to a safe evaluator that was restricted (IIRC) to something like lists/dicts/etc of ints/floats/ string/etc constants -- looks like just what you need. There is also a Cookbook recipe for a safe_eval function at http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/364469 Does anyone know of a newsreader that can automatically killfile people who suggest eval without any warnings at all? Or should we let Darwinian selection take its effect? Doesn't work, Darwininan selection would act on the unfortunate people asking, not on who careless answers use eval :( -- Gabriel Genellina -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Dec 19, 4:23 pm, John Machin [EMAIL PROTECTED] wrote: On Dec 20, 9:10 am, Larry Bates [EMAIL PROTECTED] wrote: Stef Mientki wrote: hello, I need to translate the following string a = '(0, 0, 0, 255), (192, 192, 192, 255), True, 8' into the following list or tuple b = [(0, 0, 0, 255), (192, 192, 192, 255), True, 8 ] Is there a simple way to to this. (Not needed now, but might need it in the future: even deeper nested lists, represented by a string.) thanks, Stef Mientki There are threads on this list about eval and how you need to be careful. In particular Paul Maguire recently pointed to a safe evaluator that was restricted (IIRC) to something like lists/dicts/etc of ints/floats/ string/etc constants -- looks like just what you need. I think the last thread of this nature also cited a similar tool by the effbot, which he describes here: http://www.effbot.org/zone/simple-iterator-parser.htm. This parser is about 10X faster than the equivalent pyparsing parser. -- Paul (McGuire) -- http://mail.python.org/mailman/listinfo/python-list
Re: Is there a simple way to parse this string ?
On Dec 19, 4:23 pm, John Machin [EMAIL PROTECTED] wrote: On Dec 20, 9:10 am, Larry Bates [EMAIL PROTECTED] wrote: In particular Paul Maguire recently pointed to a safe evaluator that was restricted (IIRC) to something like lists/dicts/etc of ints/floats/ string/etc constants -- looks like just what you need. The pyparsing parser can be viewed at http://pyparsing.wikispaces.com/space/showimage/parsePythonValue.py. -- Paul -- http://mail.python.org/mailman/listinfo/python-list