我们正在寻找以下伪代码中的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_back
,gc.get_referents
,ctypes
或来自功能更强大但令人恐惧的标准库之一的其他工具的某种组合?
答案 0 :(得分:1)
您可以像这样劫持函数对象的全局名称空间:
>>> exec(foo.__code__, foo_dot_globals)
apples do I exist?
apples