[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Re: string to list when the contents is a list

Matt McCredie

2/18/2010 12:52:00 AM

Wes James <comptekki <at> gmail.com> writes:

>
> I have been trying to create a list form a string. The string will be
> a list (this is the contents will look like a list). i.e. "[]" or
> "['a','b']"
>
> The "[]" is simple since I can just check if value == "[]" then return []
>
> But with "['a','b']" I have tried and get:
>
> a="['a','b']"
>
> b=a[1:-1].split(',')
>
> returns
>
> [ " 'a' "," 'b' " ]
>
> when I want it to return ['a','b'].
>
> How can I do this?


eval will work, but has a safety issue. It also has the issue of evaluating any
and everything that a user might pass in.

If you are using python 2.6 check out ast.literal_eval. It uses python's built
in ast parser to generate an AST and then traverses it to generate a python
object. Unlike eval though, it will raise an exception if anything other than a
literal is represented in the string. I have used the same function in python
2.5 (copied from 2.6) and it works just fine.

Here is a version modified from the code in python 2.6 that should only parse
lists of strings:

from _ast import List, Str, PyCF_ONLY_AST

def parse(expr, filename='<unknown>', mode='exec'):
"""
Parse an expression into an AST node.
Equivalent to compile(expr, filename, mode, PyCF_ONLY_AST).
"""
return compile(expr, filename, mode, PyCF_ONLY_AST)


def list_eval(text):
"""
Safely evaluate an expression node or a string containing a Python
expression. The string or node provided may only consist of the following
Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
and None.
"""

node = parse(text, mode='eval').body
if not isinstance(node, List):
raise ValueError('malformed string')
def _convert(node):
if isinstance(node, Str):
return node.s
raise ValueError('malformed string')

return list(map(_convert, node.elts))




Matt McCredie