需求:
# 提前声明一个上下文管理器
class timer:
    ...
   
# 调用这个管理器时实现如下效果:
import timer
with timer(100):
    x = 12 * 12
# 计算一百次 x=12*12 计算消耗的时间,等同于 for range(100)
|      1Contextualist      2021-11-09 10:09:24 +08:00 上下文管理器是(在字节码层面)被设计为必须将段落内容执行且只执行一次的。你这个需求可能得写个装饰器,然后把需要计时的片段放在一个被装饰的函数里。 | 
|  |      2SmiteChow      2021-11-09 10:12:47 +08:00 ``` with timer(100) as runner: def inner(): x = 12 * 12 runner(inner) ``` | 
|  |      3LeeReamond OP @SmiteChow 这个感觉好丑陋啊 | 
|  |      4LeeReamond OP @SmiteChow 如果要多写一行 runner(inner)我感觉直接写 for _ in range(100)也一样了。。 | 
|  |      5SmiteChow      2021-11-09 10:41:21 +08:00 @LeeReamond 你需求不是指明了要用 context 做吗?你要写 for 就写,就别考虑 context 了。 | 
|  |      6Vegetable      2021-11-09 10:43:54 +08:00 这个应该是实现不了的,不过你知道你在重新实现 timeit 吗... | 
|  |      7jaredyam      2021-11-09 10:47:13 +08:00 个人认为怎么都会多此一举。class 上下文管理主要靠 with 的传参,__enter__、__exit__方法控制,你这真要真么搞也就是在__enter__里加个 for range 。 | 
|  |      8jaredyam      2021-11-09 10:51:55 +08:00 不对,你这种需要应该不是用 class ,而是用装饰器,当然,也逃不掉 for range | 
|  |      9LeeReamond OP @Vegetable 我知道,我觉得 timeit 不好用 | 
|  |      10vanton      2021-11-09 16:29:08 +08:00 timeit 很好用啊,自己包装下不就得了。 不晓得你怎么用的。 | 
|      112i2Re2PLMaDnghL      2021-11-10 09:29:43 +08:00 上下文管理器没有回跳 不过理论上你可以在 #2 的基础上「约定」一个魔法名字, with timer(100): def __timed__(): x=12*12 然后在 timer.__exit__ 里面 inspect 出需要的作用域然后调用 100 次 __timed__ |