mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 18:03:56 -04:00
*** empty log message ***
This commit is contained in:
parent
f2609e28fb
commit
fe4c4f0172
123
direct/src/showbase/Finder.py
Normal file
123
direct/src/showbase/Finder.py
Normal 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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user