Is there a simple way to parse this string ?

S

Stef Mientki

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
 
J

josepharmbruster

Stef,

You can quickly get a tuple via:

t = eval('(0, 0, 0, 255), (192, 192, 192, 255), True, 8')

Joseph Armbruster
 
L

Larry Bates

Stef said:
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
 
J

John Machin

Stef said:
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?
 
G

Gabriel Genellina

Stef said:
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" :(
 
P

Paul McGuire

Stef said:
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)
 
J

josepharmbruster

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.
 
S

Steven D'Aprano

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, 100002, 1000004'
'"foo bar baz".split()'
'[i for i in range(100000)]'
'[19852.7412]*100000**2'
'__import__("os").system("ls -r *")'


Just because the OP's specific example is safe doesn't make eval() safe.
 
J

josepharmbruster

Steven D'Aprano,

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, 100002, 1000004'
'"foo bar baz".split()'
'[i for i in range(100000)]'
'[19852.7412]*100000**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 :)
 
S

Steven D'Aprano

Steven D'Aprano,



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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,572
Members
45,045
Latest member
DRCM

Latest Threads

Top