Skip to content

Instantly share code, notes, and snippets.

@fish2000
Created March 31, 2020 13:59
Show Gist options
  • Save fish2000/8ce5cfa748658dd491eb3ec563612ba7 to your computer and use it in GitHub Desktop.
Save fish2000/8ce5cfa748658dd491eb3ec563612ba7 to your computer and use it in GitHub Desktop.
Not much just oh you know inspecting __closure__ attributes, what about you?
# -*- coding: utf-8 -*-
from pprint import pprint
WIDTH = 100
outside = 'varible defined outside'
class YoDogg(object):
def meth2(self):
inside = 'variable defined inside'
# print("module:", self.__module__)
def inner():
assert inside
print("inner VARS:")
pprint(vars())
print()
assert outside != inside
assert self.meth2.__func__ == YoDogg.meth2
assert self.meth2.__self__ == self
inner()
print('*' * WIDTH)
print("outer VARS:")
pprint(vars())
print()
return __class__
meth2.wat = "I heard you like attributes"
def main():
instance = YoDogg()
instance.meth2()
print('*' * WIDTH)
print("instance:")
pprint(dir(instance), width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2:")
pprint(dir(instance.meth2), width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__closure__:")
pprint(instance.meth2.__closure__, width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__closure__[0]:")
pprint(dir(instance.meth2.__closure__[0]), width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__closure__[0].cell_contents:")
pprint(instance.meth2.__closure__[0].cell_contents, width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__code__:")
pprint(dir(instance.meth2.__code__), width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__code__.co_cellvars:")
pprint(instance.meth2.__code__.co_cellvars, width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__code__.co_freevars:")
pprint(instance.meth2.__code__.co_freevars, width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__code__.co_names:")
pprint(instance.meth2.__code__.co_names, width=WIDTH)
print()
print('*' * WIDTH)
print("instance.meth2.__code__.co_varnames:")
pprint(instance.meth2.__code__.co_varnames, width=WIDTH)
print()
# tl;dr
instance.meth2()
assert 'wat' in dir(instance.meth2)
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment