*** empty log message ***

This commit is contained in:
Joe Shochet 2001-02-02 19:51:00 +00:00
parent f2609e28fb
commit fe4c4f0172

View File

@ -0,0 +1,123 @@
import types
def findClassInModule(module, className, nesting, visited=[]):
# Make sure you have not already visited this module
# to prevent recursion
if module in visited:
return None
# Ok, clear to proceed, add this module to the visited list
visited.append(module)
print ('visiting: ' + `module`)
for key in module.__dict__.keys():
value = module.__dict__[key]
if (type(value) == types.ClassType):
if value.__name__ == className:
return value
elif (type(value) == types.ModuleType):
ret = findClassInModule(value, className, nesting+1, visited)
if ret:
return ret
# otherwise keep looking
return None
def findClass(builtins, className):
for key in builtins.keys():
value = builtins[key]
if (type(value) == types.ClassType):
if value.__name__ == className:
return value
elif (type(value) == types.ModuleType):
ret = findClassInModule(value, className, 0)
if ret:
return ret
# otherwise keep looking
return None
def rebindClass(builtins, filename):
tempClassName = 'py_temp_class'
file = open(filename)
lines = file.readlines()
curLine = 0
found = 0
foundLine = -1
foundChar = -1
for i in range(len(lines)):
line = lines[i]
if (line[0:6] == 'class '):
classHeader = line[6:]
# Look for a open paren if it does inherit
parenLoc = classHeader.find('(')
if parenLoc > 0:
className = classHeader[:parenLoc]
print 'found className: ' + className
found = 1
foundLine = i
foundChar = parenLoc
else:
# Look for a colon if it does not inherit
colonLoc = classHeader.find(':')
if colonLoc > 0:
className = classHeader[:colonLoc]
print 'found className: ' + className
found = 1
foundLine = i
foundChar = colonLoc
if not found:
print 'error: className not found'
return None
# Store the original real class
realClass = findClass(builtins, className)
tmpfilename = '/usr/local/tmp_py_file'
tmpfile = open(tmpfilename, 'w')
# newline = 'class ' + tempClassName + lines[foundLine][(6+foundChar):]
newline = 'class ' + tempClassName + ':\012'
# now write the class back to the file with the new class name
for i in range(len(lines)):
if (i == foundLine):
tmpfile.write(newline)
else:
tmpfile.write(lines[i])
file.close()
tmpfile.close()
# Now execute that class def
execfile(tmpfilename, builtins)
tmpClass = findClass(builtins, tempClassName)
print 'realClass: ' + `realClass`
print 'tmpClass: ' + `tmpClass`
# Reassign the new dict
#copyFuncs(tmpClass, realClass)
copyDict(tmpClass, realClass)
def copyFuncs(fromClass, toClass):
for key in fromClass.__dict__.keys():
value = fromClass.__dict__[key]
if (type(value) == types.FunctionType):
toClass.__dict__[key] = value
def copyDict(fromClass, toClass):
oldModule = toClass.__module__
toClass.__dict__ = fromClass.__dict__
toClass.__module__ = oldModule
class Finder:
def __init__(self):
pass
def tester(self):
pass