string to list when the contents is a list

Matt McCredie mccredie at
Thu Feb 18 01:51:39 CET 2010

Wes James <comptekki <at>> 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

More information about the Python-list mailing list