dry-python / dry-python/returns

Add a method to get intermediate return values from flow

未关闭
#868 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Python
星标
4.4k
派生
155
平均合并
2 小时 27 分钟
30 天内合并 PR
22

描述

Hi!

It would be nice for testing to have a way to retrieve the intermediate result of a flow, in a way similar to how `assert_flow()` works but with the return value.

Example:

```python
def do_stuff():
return flow(0, func_1, bind(func_2))

def test_func_1():
v = get_function_value(func_1, do_stuff)
assert v == expected_value
```

In principle this can be done with `sys.setprofile` (in the trace function and for `return` events, `arg` contains the return value).

Proof of concept example:

```python
def trace_func(function_to_search, frame, event, arg):
if event == 'return' and frame.f_code.co_name == function_to_search.__name__:
# modified exception to hold the return value under "value" attr
raise DesiredValueFound(arg)

def get_function_value(function_to_search, my_flow):
old_tracer = sys.gettrace()
sys.setprofile(partial(trace_func, function_to_search))

try:
my_flow()
except DesiredValueFound as e:
return e.value
finally:
sys.settrace(old_tracer)
```

What do you think?

Thanks :)

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。