相关疑难解决方法(0)

是否可以访问封闭的上下文管理器?

使用with语句基本上有三种方法:

使用现有的上下文管理器:

with manager:
    pass
Run Code Online (Sandbox Code Playgroud)

创建上下文管理器并将其结果绑定到变量:

with Manager() as result:
    pass
Run Code Online (Sandbox Code Playgroud)

创建上下文管理器并丢弃其返回值:

with Manager():
    pass
Run Code Online (Sandbox Code Playgroud)

如果我们get_manager()在上面的三个块中放置了一个函数,是否有任何实现可以返回封闭的上下文管理器,或者至少它们的__exit__函数?

在第一种情况下,这显然很容易,但我想不出能让它在另外两种情况下工作的方法.我怀疑是否可以获得整个上下文管理器,因为值堆栈会在SETUP_WITH操作码之后立即弹出.但是,由于__exit__函数存储在块堆栈中SETUP_WITH,是否有某种方法可以访问它?

python contextmanager

15
推荐指数
2
解决办法
3072
查看次数

为什么Contextmanager抛出运行时错误'生成器在throw()之后没有停止?

在我的utility.py中,我有,

@contextmanager
def rate_limit_protection(max_tries=3, wait=300):
    tries = 0
    while max_tries > tries:
        try:
            yield
            break
        except FacebookRequestError as e:
            pprint.pprint(e)
            if e._body['error']['message'] == '(#17) User request limit reached':
                print("waiting...")
                time.sleep(wait)
                tries += 1
Run Code Online (Sandbox Code Playgroud)

在我的task.py中,我打电话给:

for date in interval:
   with utility.rate_limit_protection():
      stats = account.get_insights(params=params)
Run Code Online (Sandbox Code Playgroud)

在执行给定日期范围的任务后,一旦Facebook速率限制启动,程序将等待300秒,然后失败并显示错误.

File "/Users/kamal/.pyenv/versions/3.4.0/lib/python3.4/contextlib.py", line 78, in __exit__
    raise RuntimeError("generator didn't stop")
RuntimeError: generator didn't stop
Run Code Online (Sandbox Code Playgroud)

python contextmanager

12
推荐指数
1
解决办法
4679
查看次数

是否可以在上下文管理器的__exit __()方法中访问上下文对象(代码块)?

我想在exit()方法中再次调用代码对象,如果它引发异常(可能是几次,可能有延迟).我知道装饰器很容易,但我的动机是有时候我想重复一些代码片段,我不想提取到一个单独的函数并装饰它.我正在寻找这些方面的东西:

class again(object):
    def __enter__(self):
        pass

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type is not None:
            ????        # Invoke the code object again
            return True # eat exception
Run Code Online (Sandbox Code Playgroud)

它会像这样使用:

x = 0
with again():
    print x
    x += 1
    if x == 1:
         raise Exception('I hate 1')
Run Code Online (Sandbox Code Playgroud)

而预期的产出将是:

0
1  
Run Code Online (Sandbox Code Playgroud)

我可以找到一种方法来获取代码对象.没有任何上下文管理器属性似乎引用它(我想这不是真正需要的,因为它的工作只是在前后做事).

有可能吗?

python contextmanager

3
推荐指数
1
解决办法
699
查看次数

标签 统计

contextmanager ×3

python ×3