Python 如何将上下文管理器中的段落执行多次?

2021-11-09 09:32:47 +08:00
 LeeReamond

需求:

# 提前声明一个上下文管理器
class timer:
    ...
   
# 调用这个管理器时实现如下效果:
import timer
with timer(100):
    x = 12 * 12

# 计算一百次 x=12*12 计算消耗的时间,等同于 for range(100)
2083 次点击
所在节点    Python
11 条回复
Contextualist
2021-11-09 10:09:24 +08:00
上下文管理器是(在字节码层面)被设计为必须将段落内容执行且只执行一次的。你这个需求可能得写个装饰器,然后把需要计时的片段放在一个被装饰的函数里。
SmiteChow
2021-11-09 10:12:47 +08:00
```
with timer(100) as runner:
def inner():
x = 12 * 12
runner(inner)

```
LeeReamond
2021-11-09 10:37:02 +08:00
@SmiteChow 这个感觉好丑陋啊
LeeReamond
2021-11-09 10:37:29 +08:00
@SmiteChow 如果要多写一行 runner(inner)我感觉直接写 for _ in range(100)也一样了。。
SmiteChow
2021-11-09 10:41:21 +08:00
@LeeReamond 你需求不是指明了要用 context 做吗?你要写 for 就写,就别考虑 context 了。
Vegetable
2021-11-09 10:43:54 +08:00
这个应该是实现不了的,不过你知道你在重新实现 timeit 吗...
jaredyam
2021-11-09 10:47:13 +08:00
个人认为怎么都会多此一举。class 上下文管理主要靠 with 的传参,__enter__、__exit__方法控制,你这真要真么搞也就是在__enter__里加个 for range 。
jaredyam
2021-11-09 10:51:55 +08:00
不对,你这种需要应该不是用 class ,而是用装饰器,当然,也逃不掉 for range
LeeReamond
2021-11-09 12:17:41 +08:00
@Vegetable 我知道,我觉得 timeit 不好用
vanton
2021-11-09 16:29:08 +08:00
timeit 很好用啊,自己包装下不就得了。
不晓得你怎么用的。
2i2Re2PLMaDnghL
2021-11-10 09:29:43 +08:00
上下文管理器没有回跳
不过理论上你可以在 #2 的基础上「约定」一个魔法名字,
with timer(100):
def __timed__():
x=12*12

然后在 timer.__exit__ 里面 inspect 出需要的作用域然后调用 100 次 __timed__

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814044

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX