Introspection¶
type() returns the class of an object
hasattr() / getattr() / setattr to query / get / set a property
issubclass()
for (n, v) in myobj.__dict__.items(): print "%s: %s" % (n, v)
Import-Hook¶
import __builtin__
old_import = __builtin__.__import__
known_imports = []
def import_hook(name, globals=None, locals=None, fromlist=None):
if name.startswith("django_chuck") and name not in known_imports:
if fromlist:
for symbol in fromlist:
print name + "." + symbol
known_imports.append(name + "." + symbol)
else:
print name
known_imports.append(name)
return old_import(name, globals, locals, fromlist)
__builtin__.__import__ = import_hook
Inrospect imports with compiler¶
# code borrowed from zope
class ImportFinder:
def __init__(self):
self.imports = []
def visitFrom(self, statement):
stmt = statement.asList()
if stmt[0] == '__future__':
# we don't care what's imported from the future
return
names_dict = {}
for orig_name, as_name in stmt[1]:
# we don't care about from import *
if orig_name == '*':
continue
self.imports.append(stmt[0] + "." + orig_name)
def visitImport(self, stmt):
for orig_name, as_name in stmt.names:
self.imports.append(orig_name)
ast = compiler.parseFile("django_chuck/commands/create_project.py")
log = ImportFinder()
compiler.walk(ast, log)
print log.imports