gpt4 book ai didi

python - 使用Inspect模块执行特定代码

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:44 25 4
gpt4 key购买 nike

为了简单起见,我将问题范围缩小到以下范围:

我有一个执行一系列函数的主函数。从第一个函数 manipulate() 开始,我希望能够阻止 test() 使用 sys.exit() 退出程序。我还需要能够使 print("Silence me") 静音,这意味着这不应该出现在我的程序的输出中。最后,我的程序仍然需要能够从 test() 函数输出 print("You need tohear this")

def main():
manipulate()
test()
def manipulate():

print("Silence me")
sys.exit()
print("You need to hear this")

如果我只能更改操作()函数中的代码,如何实现此目的?

我尝试过使用检查模块,但我认为我可能遗漏了一些东西。我不确定解析 test() 的代码并通过 exec() 运行解析的代码是否是解决此问题的正确方法。

def manipulate():
def filter_exc(func):
src = inspect.getsource(func)

lines = src.split('\n')
out = lines[0] + "\n"

for line in lines[1:]:
m = re.match('(\s*)(.*)', line)
lead, text = m.groups()
if 'sys.exit()' in line:
continue
if 'Silence Me' in line:
continue
out += " " + text + '\n'

return out

exec(filter_exc(game_on))

最佳答案

首先,你需要知道你所做的事情是不好的。编程语言的设计确实执行源代码,而不是限制执行。编辑实时字节码是邪恶的,会产生不可调试的错误。

抛开免责声明不谈,您可以通过使用 patch 更干净地实现此效果从标准库替换 exitprint 的标准实现,但您需要执行类似

的操作
from unittest.mock import patch
import sys


def my_print(*args, **kwargs):
# do whatever
return


def my_exit(*args, **kwargs):
# do whatever
return


def perform_patch():
patchers = [
patch('__main__.print', my_print),
patch('sys.exit', my_exit)
]
for patcher in patchers:
patcher.start()
return patchers


def perform_unpatch(patchers):
for patcher in patchers:
patcher.stop()


def manipulate():
print("hello")
sys.exit(1)


def main():
patchers = perform_patch()
manipulate()
perform_unpatch(patchers)
print("I'm done!")


if __name__ == '__main__':
main()

脚本仅输出“我完成了!”。

exitprint 保持修补状态,直到您调用 patcher.stop()patch 可以在 with block 中使用,因此如果可以将 manipulate() 调用放在 with 内,则可以做得更干净声明。

另一种方法是获取源代码并使用 ast模块来动态重写它。这是 talk about ASTs .

最后你可以直接用字节码做一些事情,这是一个 talk exploring that .

最后,我真诚地鼓励您使用任何其他可能的方式来编辑源代码。如果它是一个库,那么直接 fork 它并直接编辑源代码会更好。

关于python - 使用Inspect模块执行特定代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56820600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com