Jp Calderone wrote: > Probably not. For example: > > >>> (1).__class__.__bases__[0].__subclasses__()[-1]('/dev/null') > <open file '/dev/null', mode 'r' at 0xb7df53c8>
However: py> eval("(1).__class__.__bases__[0]" ... ".__subclasses__()[16]('/dev/null')", ... dict(__builtins__={})) Traceback (most recent call last): File "<interactive input>", line 3, in ? File "<string>", line 0, in ? IOError: file() constructor not accessible in restricted mode Also worth noting that you can't get the builtins through a function's globals either: py> eval("(1).__class__.__bases__[0]" ... ".__subclasses__()[17].substitute.func_globals", ... dict(__builtins__={})) Traceback (most recent call last): File "<interactive input>", line 3, in ? File "<string>", line 0, in ? RuntimeError: restricted attribute I've read some of the older posts, which suggested that you could restore __builtins__ using a global declaration and a delete, but I can't reproduce that bug in current Python. Note that even if you supply the file object as part of your __builtins__, the constructor is still not accessible in restricted mode: py> eval("file('/dev/null')", dict(__builtins__=dict(file=file))) Traceback (most recent call last): File "<interactive input>", line 1, in ? File "<string>", line 0, in ? IOError: file() constructor not accessible in restricted mode I believe the official stance is something like: "Well restricted mode probably works in a lot of cases, but we're not confident enough in it (having found bugs in it over and over) that we'd suggest it for production use." STeVe -- http://mail.python.org/mailman/listinfo/python-list