有什么方法可以手动设置particulair函数的全局名称空间吗?

时间:2019-10-28 00:20:57

标签: python python-3.x globals

我们正在寻找以下伪代码中的set_globals的实现:

def foo():
    """
    GLOBALS: `str`, `print`
    """
    print('apples', 'do I exist?')
    print(str('apples'))

foo_dot_globals = {'print':print, 'str':str, 'globby':1}
# set_globals(foo, foo_dot_globals)

#############################################
#  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)

str = lambda s, *, str=str:\
    int(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

思想:

也许我们可以使用inspect.currentframe().f_backgc.get_referentsctypes或来自功能更强大但令人恐惧的标准库之一的其他工具的某种组合?

1 个答案:

答案 0 :(得分:1)

您可以像这样劫持函数对象的全局名称空间:

>>> exec(foo.__code__, foo_dot_globals)
apples do I exist?
apples