http://www.nabble.com/class---function-call-behaviour-(Jython-vs.-CPython)-to18208441.html
At the moment Jython represents several calls to classes
as function calls.
Here is some output of CPython 2.5 and Jython svn asm branch r4826:
gebe@venus:~/work/crash$ python test.py
class
********************
f_locals: {'__module__': '__main__', 'classLevelFrameInfo': ('class',
<module '__main__' from 'test.py'>, {...}, {'kind': 'class',
'f_globals': {...}, 'frameInfo': <function frameInfo at 0xb7d2ad84>,
'__builtins__': <module '__builtin__' (built-in)>, 'ClassType': <type
'classobj'>, '__file__': 'test.py', 'module': <module '__main__' from
'test.py'>, 'f_locals': {...}, 'sys': <module 'sys' (built-in)>,
'ClassicClass': <class __main__.ClassicClass at 0xb7d3465c>, '__name__':
'__main__', '__doc__': None}), '__doc__': None}
f_globals: {'kind': 'class', 'f_globals': {...}, 'frameInfo': <function
frameInfo at 0xb7d2ad84>, '__builtins__': <module
'__builtin__' (built-in)>, 'ClassType': <type 'classobj'>, '__file__':
'test.py', 'module': <module '__main__' from 'test.py'>, 'f_locals':
{'__module__': '__main__', 'classLevelFrameInfo': ('class', <module
'__main__' from 'test.py'>, {...}, {...}), '__doc__': None}, 'sys':
<module 'sys' (built-in)>, 'ClassicClass': <class __main__.ClassicClass
at 0xb7d3465c>, '__name__': '__main__', '__doc__': None}
gebe@venus:~/work/crash$ jython25 test.py
function call
********************
f_locals: {'__doc__': None, '__module__': '__main__',
'classLevelFrameInfo': ('function call', <module '__main__' from
'test.py'>, {...}, {'ClassicClass': <class __main__.ClassicClass at 1>,
'sys': sys module, '__file__': 'test.py', '__doc__': None, 'f_globals':
{...}, 'frameInfo': <function frameInfo at 2>, 'kind': 'function call',
'__name__': '__main__', 'f_locals': {...}, 'ClassType': <type 'class'>,
'module': <module '__main__' from 'test.py'>})}
f_globals: {'ClassicClass': <class __main__.ClassicClass at 1>, 'sys':
sys module, '__file__': 'test.py', '__doc__': None, 'f_globals': {...},
'frameInfo': <function frameInfo at 2>, 'kind': 'function call',
'__name__': '__main__', 'f_locals': {'__doc__': None, '__module__':
'__main__', 'classLevelFrameInfo': ('function call', <module '__main__'
from 'test.py'>, {...}, {...})}, 'ClassType': <type 'class'>, 'module':
<module '__main__' from 'test.py'>}
The code is a modified version of the parts for testing included in
zope.interface:
gebe@venus:~/work/crash$ cat test.py
from myimport import *
from types import ClassType
class ClassicClass:
classLevelFrameInfo = frameInfo(sys._getframe())
kind, module, f_locals, f_globals = ClassicClass.classLevelFrameInfo
print kind
print "*" * 20
print "f_locals: ", f_locals
print
print "f_globals: ", f_globals
--------------------------------------------------
gebe@venus:~/work/crash$ cat myimport.py
import sys
def frameInfo(frame):
f_locals = frame.f_locals
f_globals = frame.f_globals
sameNamespace = f_locals is f_globals
hasModule = '__module__' in f_locals
hasName = '__name__' in f_globals
sameName = hasModule and hasName
sameName =sameName and f_globals['__name__']==f_locals['__module__']
module = hasName and sys.modules.get(f_globals['__name__']) or None
namespaceIsModule = module and module.__dict__ is f_globals
if not namespaceIsModule:
kind = "exec"
elif sameNamespace and not hasModule:
kind = "module"
elif sameName and not sameNamespace:
kind = "class"
elif not sameNamespace:
kind = "function call"
else:
kind = "unknown"
return kind, module, f_locals, f_globals |