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 -- http://mail.python.org/mailman/listinfo/python-list