python - 在调用函数前不久,我们如何恢复定义函数时存在的命名空间(全局、局部等)?
问题描述
我在下面的尝试不起作用。没有未处理的错误或异常,但打印到控制台的消息不符合预期。
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
我正在尝试恢复定义函数时存在的命名空间(全局变量、局部变量等)。
解决方案
推荐阅读
- reactjs - 我试图从项目中排除momentjs,但这并没有给出结果
- vue.js - 如何在Vue vmodal中绑定动态html内容
- java - 从 Google Cloud Run 托管应用程序触发的 Pub/Sub 消息需要很长时间
- python - 从 Scrapy 管道中删除重复项
- python - AttributeError:模块“werkzeug.utils”没有属性“send_from_directory”
- c - 当一个函数在另一个函数的名称中(而不是在参数中)时,C 中的含义是什么?
- java - 如何修复 actionPerformed 方法中找不到符号?
- typescript - 为什么 .forEach 回调函数中的类型不尊重打字稿中未定义的检查?
- python - 从烧瓶会话中获取用户名到 gunicorn 日志
- c - Ceedling未能模拟标题