gpt4 book ai didi

python - 是否可以控制函数在 python 中的执行方式?

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

我知道 python 非常灵活,允许 - 几乎 - 用户想要的任何东西。但是我从来没见过也没听说过这样的功能,网上也找不到相关的东西:是否可以一步一步执行一个函数的变量?

def example_function():
print("line 1")
# stuff
print("line 2")
# stuff
return(3)

def step_by_step_executor(fn):
while fn.has_next_step():
print(fn.current_step)
fn.execute_step()
return fn.return

step_by_step_executor(example_function)
# print("line 1")
# line 1
# stuff
# print("line 2")
# line 2
# stuff
# return(3)
# returns 3

我想我可以使用 inspectexec__call__ 的组合来实现类似的东西,但我有兴趣看看是否已经有一个现成的名称和实现。

示例用例:

@do_y_instead_of_x
def some_function():
do stuff
do x
do more
some_function()
# does stuff
# does y
# does more

@update_progress_bar_on_loops
def some_other_function():
do stuff
for x in range...:
...
do more
some_other_function()
# does stuff
# initializes a progress bar, reports whats going on, does the loop
# does more

最佳答案

您可以创建一个 Python 调试器 pdb.Pdb 实例,并向其传递一个自定义类文件对象,该对象实现了 write 方法以有选择地输出调试器的代码部分调试器输出,以及始终向调试器发送 n(next 的缩写)命令的 readline 方法。由于调试器总是两次输出从函数返回的行,第二次之前是 --Return-- 行,您可以使用标志来避免输出多余的 return 行:

import pdb

class PdbHandler:
def __init__(self):
self.returning = False

def write(self, buffer):
if buffer == '--Return--':
self.returning = True

# each line of code is prefixed with a '-> '
_, *code = buffer.split('\n-> ', 1)
if code:
if self.returning:
self.returning = False
else:
print(code[0])

def readline(self):
return 'n\n'

def flush(self):
pass

def example_function():
print("line 1")
print("line 2")
return (3)

handler = PdbHandler()
print('returns', pdb.Pdb(stdin=handler, stdout=handler).runcall(example_function))

这个输出:

print("line 1")
line 1
print("line 2")
line 2
return (3)
returns 3

关于python - 是否可以控制函数在 python 中的执行方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57599783/

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