import sys
import copy
import types
from inspect import isfunction
class UsingHolder:
def __init__(self, frame, old_locals):
self.frame = frame
self.old_locals = old_locals
def __enter__(self):
print 'Using is entered'
def __exit__(self, type, value, tb):
for local in self.frame.f_locals.keys():
if local not in self.old_locals:
del self.frame.f_locals[local]
print 'Using holder is deleted'
def using(o):
frame = sys._getframe().f_back
old_locals = copy.copy(frame.f_locals)
frame.f_locals.update(o.__dict__)
for n, f in o.__class__.__dict__.items():
if isfunction(f):
frame.f_locals[n] = lambda *args, **kwargs: f(o, *args, **kwargs)
return UsingHolder(frame, old_locals)
class A:
def __init__(self):
self.i = 10
def f(self, j):
print self.i, j
@staticmethod
def g():
pass
def do_something():
a = A()
with using(a):
exec('')
f(20)
do_something()
aW1wb3J0IHN5cwppbXBvcnQgY29weQppbXBvcnQgdHlwZXMKZnJvbSBpbnNwZWN0IGltcG9ydCBpc2Z1bmN0aW9uCgpjbGFzcyBVc2luZ0hvbGRlcjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcmFtZSwgb2xkX2xvY2Fscyk6CiAgICAgICAgc2VsZi5mcmFtZSA9IGZyYW1lCiAgICAgICAgc2VsZi5vbGRfbG9jYWxzID0gb2xkX2xvY2FscwogICAgCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHByaW50ICdVc2luZyBpcyBlbnRlcmVkJwogICAgCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKICAgICAgICBmb3IgbG9jYWwgaW4gc2VsZi5mcmFtZS5mX2xvY2Fscy5rZXlzKCk6CiAgICAgICAgICAgIGlmIGxvY2FsIG5vdCBpbiBzZWxmLm9sZF9sb2NhbHM6CiAgICAgICAgICAgICAgICBkZWwgc2VsZi5mcmFtZS5mX2xvY2Fsc1tsb2NhbF0KICAgICAgICAKICAgICAgICBwcmludCAnVXNpbmcgaG9sZGVyIGlzIGRlbGV0ZWQnCgpkZWYgdXNpbmcobyk6CiAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2sKICAgIG9sZF9sb2NhbHMgPSBjb3B5LmNvcHkoZnJhbWUuZl9sb2NhbHMpCiAgICAKICAgIGZyYW1lLmZfbG9jYWxzLnVwZGF0ZShvLl9fZGljdF9fKQogICAgZm9yIG4sIGYgaW4gby5fX2NsYXNzX18uX19kaWN0X18uaXRlbXMoKToKICAgICAgICBpZiBpc2Z1bmN0aW9uKGYpOgogICAgICAgICAgICBmcmFtZS5mX2xvY2Fsc1tuXSA9IGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IGYobywgKmFyZ3MsICoqa3dhcmdzKQogICAgCiAgICByZXR1cm4gVXNpbmdIb2xkZXIoZnJhbWUsIG9sZF9sb2NhbHMpCgpjbGFzcyBBOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaSA9IDEwCiAgICAgICAgCiAgICBkZWYgZihzZWxmLCBqKToKICAgICAgICBwcmludCBzZWxmLmksIGoKICAgICAgICAKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBnKCk6CiAgICAgICAgcGFzcwoKZGVmIGRvX3NvbWV0aGluZygpOgogICAgYSA9IEEoKQogICAgd2l0aCB1c2luZyhhKToKICAgICAgICBleGVjKCcnKQogICAgICAgIGYoMjApCgpkb19zb21ldGhpbmcoKQo=