diff --git a/py/__init__.py b/py/__init__.py index 378cce9bb..05d33f0b0 100644 --- a/py/__init__.py +++ b/py/__init__.py @@ -153,6 +153,7 @@ initpkg(__name__, 'builtin._istext' : ('./builtin/builtin31.py', '_istext'), 'builtin._getimself' : ('./builtin/builtin31.py', '_getimself'), 'builtin._getcode' : ('./builtin/builtin31.py', '_getcode'), + 'builtin._getfuncdict' : ('./builtin/builtin31.py', '_getfuncdict'), 'builtin.builtins' : ('./builtin/builtin31.py', 'builtins'), 'builtin.execfile' : ('./builtin/builtin31.py', 'execfile'), 'builtin.callable' : ('./builtin/builtin31.py', 'callable'), diff --git a/py/builtin/builtin31.py b/py/builtin/builtin31.py index 382993481..68af8323a 100644 --- a/py/builtin/builtin31.py +++ b/py/builtin/builtin31.py @@ -25,6 +25,9 @@ if sys.version_info >= (3, 0): def _getcode(function): return function.__code__ + def _getfuncdict(function): + return getattr(function, "__dict__", None) + def execfile(fn, globs=None, locs=None): if globs is None: back = sys._getframe(1) @@ -64,6 +67,9 @@ else: def _getcode(function): return function.func_code + def _getfuncdict(function): + return getattr(function, "__dict__", None) + import __builtin__ as builtins def print_(*args, **kwargs): """ minimal backport of py3k print statement. """ diff --git a/py/builtin/testing/test_builtin.py b/py/builtin/testing/test_builtin.py index 6f885cabe..41152a1b0 100644 --- a/py/builtin/testing/test_builtin.py +++ b/py/builtin/testing/test_builtin.py @@ -105,6 +105,13 @@ def test_execfile(tmpdir): py.builtin.execfile(str(test_file)) assert A.x == 3 +def test_getfuncdict(): + def f(): + pass + f.x = 4 + assert py.builtin._getfuncdict(f)["x"] == 4 + assert py.builtin._getfuncdict(2) is None + def test_callable(): class A: pass assert py.builtin.callable(test_callable)