how to convert string to list or tuple

Steven Bethard steven.bethard at gmail.com
Wed Jun 1 10:52:54 EDT 2005


Duncan Booth wrote:
> Steven Bethard wrote:
> 
> 
>>Interestingly, I don't seem to be able to create a file object as a 
>>class attribute in restricted mode:
>>
>>py> class C(object):
>>...     def __init__(self):
>>...         self.f = file('temp.txt', 'w')
>>...
>>py> eval('''[ cls for cls in
>>{}.__class__.__bases__[0].__subclasses__() if cls.__name__ ==
>>'C'][0]().f.write("stuff")''', dict(__builtins__=None)) Traceback
>>(most recent call last): 
>>   File "<interactive input>", line 1, in ?
>>   File "<string>", line 0, in ?
>>AttributeError: 'C' object has no attribute 'f'
>>py> eval('''[ cls for cls in
>>{}.__class__.__bases__[0].__subclasses__() if cls.__name__ ==
>>'C'][0]().__dict__''', dict(__builtins__=None)) {}
> 
> Weird. I copied and paste your class and eval exactly (apart from deleting 
> the ... prompts) and it worked exactly as expected: writing 'stuff' to 
> temp.txt. (Python 2.4)

So, I played around with this a little bit.  If I start up a new 
interpreter and type it in like above, I get the behavior you do.  What 
I had actually done (abbreviated) was:

py> class C(object):
...     pass
...
py> class C(object):
...     def __init__(self):
...         self.f = file('temp.txt', 'w')
...
py> eval('''[ cls for cls in {}.__class__.__bases__[0].__subclasses__() 
if cls.__name__ == 'C'][0]().f.write("stuff")''', dict(__builtins__=None))
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
   File "<string>", line 0, in ?
AttributeError: 'C' object has no attribute 'f'

And the problem with this is that both __main__.C objects are now 
subclasses of object:

py> eval('''[ cls for cls in {}.__class__.__bases__[0].__subclasses__() 
if cls.__name__ == 'C']''', dict(__builtins__=None))
[<class '__main__.C'>, <class '__main__.C'>]

So I was getting the wrong __main__.C object.  Sorry for the confusion!

Now, even using this technique, *your* code can't call the file constructor:

py> class C(object):
...     def __init__(self):
...         self.file = file
...
py> eval('''[ cls for cls in {}.__class__.__bases__[0].__subclasses__() 
if cls.__name__ == 'C'][-1]().file("temp.txt", "w")''', 
dict(__builtins__=None))
Traceback (most recent call last):
   File "<interactive input>", line 1, in ?
   File "<string>", line 0, in ?
IOError: file() constructor not accessible in restricted mode

But unless the person eval-ing your code *only* writes immaculate code I 
can see that you can probably screw them. ;)  I wonder why 
__subclasses__ isn't a restricted attribute...  Is it ever used for 
something that isn't evil? ;)

STeVe



More information about the Python-list mailing list