Незадолго до вызова функции, как мы можем восстановить пространство имен (глобальные, локальные и т. Д.), Которое существовало на момент определения функции? - PullRequest
1 голос
/ 29 октября 2019

Моя попытка ниже не работает. Не существует необработанных ошибок или исключений, но сообщения, выводимые на консоль, не соответствуют желаемым.

import inspect

class Fob:

    def __init__(i, func):
        f = inspect.currentframe().f_back
        i._globals = f.f_globals
        i._builtins = f.f_builtins
        i._locals = f.f_locals
        del f
        i._func = func

    def __call__(i, *args, **kwargs):
        localz = i._locals
        globalz = i._globals

        d = globalz
        d['i'] = i
        d['args'] = args
        d['kwargs'] = kwargs

        r = eval("i._func(*args, **kwargs)", globalz, localz)
        return r
@Fob
def foo():
    """
    GLOBALS: `str`, `print`
    """
    print('apples', 'do I exist?')
    print(str('apples'))


#############################################
#  END OF DEFINING `foo`
#  BEGIN MESSING UP GLOBALS
#############################################

import sys
def print(*args, end="\n", file=sys.stdout, print=print):
    print("SIKE!", type(args[0]), args[0], file=file, end=end)


import string
is_letter = lambda ch, *, str=str:\
    ch in string.ascii_lowercase

str = lambda s, *, str=str, is_letter=is_letter, filter=filter:\
    int(''.join(filter(is_letter, str(s).lower())), 36)


#############################################
#  END MESSING UP GLOBALS. BEGIN CALLING foo()
#############################################

foo()

Желаемый выход:

apples do I exist?
apples

ТЕКУЩИЙ ВЫХОД:

SIKE! <class 'str'> apples
SIKE! <class 'int'> 647846308

Я пытаюсь восстановить пространство имен (глобальные, локальные и т. Д.), Которое существовало на момент определения функции.

...