- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试编写一个带有上下文管理器的多线程助手。这个想法是在一个 block 内定义一堆函数,上下文管理器“神奇地”负责调度和一切。简化的工作版本如下所示:
import contextlib
@contextlib.contextmanager
def multi_threaded(count):
funcs = []
yield funcs
my_slice = int(count / len(funcs))
for i, func in enumerate(funcs):
start = my_slice * i
func(start, start + my_slice)
def spawn_many():
dataset = [1, 2, 3, 4, 5]
with multi_threaded(len(dataset)) as mt:
def foo(start_idx, end):
print("foo" + str(dataset[start_idx : end]))
def bar(start_idx, end):
print("bar" + str(dataset[start_idx : end]))
mt.append(foo)
mt.append(bar)
spawn_many()
这个示例有效,但我想删除这些行:
mt.append(foo)
mt.append(bar)
这样用户只需要定义函数而不需要将它们添加到集合中。为什么?因为它不太容易出错,而且我无法控制用这个库编写的代码。
问题是,在yield之后,我超出了发生def foo
的范围,所以我不知道该范围内存在的locals()
,这基本上就是我需要知道其中定义了哪些函数的内容。有什么想法/技巧/鼓励的话吗?
感谢您的阅读!
最佳答案
装饰器可能会更好一点:
import contextlib
@contextlib.contextmanager
def multi_threaded(count):
funcs = []
yield funcs
my_slice = int(count / len(funcs))
for i, func in enumerate(funcs):
start = my_slice * i
func(start, start + my_slice)
def add_to_flist(mt):
def _add_to_flist(func):
mt.append(func)
return func
return _add_to_flist
def spawn_many():
dataset = [1, 2, 3, 4, 5]
with multi_threaded(len(dataset)) as mt:
@add_to_flist(mt)
def foo(start_idx, end):
print("foo" + str(dataset[start_idx : end]))
@add_to_flist(mt)
def bar(start_idx, end):
print("bar" + str(dataset[start_idx : end]))
spawn_many()
关于python - ContextManager 访问调用 with block 的 locals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705018/
在我的代码中,我需要能够正确打开和关闭设备,因此需要使用上下文管理器。虽然上下文管理器通常被定义为具有 __enter__ 和 __exit__ 方法的类,但似乎也有可能装饰一个函数以与上下文管理器一
这是我正在使用的代码: from contextlib import contextmanager from functools import wraps class with_report_stat
我想使用上下文管理器实现类似伪数据库的事务。 举个例子: class Transactor: def a(): pass def b(d, b): pass def c(i):
我想替换类的 __enter__/__exit__具有单个函数的函数装饰为 contextlib.contextmanager ,这里是代码: class Test: def __enter_
是否可以在上下文管理器中捕获异常? 背景:方法 get_data_from_remote_system() 每五分钟连接到远程系统并获取数据。 有时网络会关闭。 我想将异常消息抑制 30 分钟。 30
我正在尝试创建一个包装器来使上下文对象成为可选的。当条件为真时,事物应该表现得像包装的上下文对象,否则它应该表现得像无操作上下文对象。此示例适用于使用一次包装对象,但失败了,它被重新使用。 例子: i
我有以下代码 from contextlib import contextmanager @contextmanager def simple_context_manager(): print
这个问题在这里已经有了答案: "Least Astonishment" and the Mutable Default Argument (33 个答案) Python constructor an
一位同事向我指出,with 语句可能很慢。因此,我进行了测量,发现从 contextmanager 函数中获取值的时间确实比从 Python 2.7 中的生成器中获取值的时间长 20 倍,在 PyPy
为什么我可以跳过在 yield log_func 中调用 log_func,即我可以只写 yield 而代码仍然有效。这是为什么? yield 在这种情况下如何工作? import time from
假设我有一个上下文管理器: @contextmanager def cm(x): y = f(x) z = yield y g(z) 如何将 z 发送到上下文管理器? 我试过:
例如: @contextmanager def add_stuff(arg): parser = Parser(arg) # do something here yield p
我试图用上下文管理器隐藏一些 try/except 的复杂性。这是一个简单的例子: from contextlib import contextmanager import mpd mpdclient
我正在使用的库采用如下函数: @contextlib.contextmanager def stdout_cm(): yield sys.stdout 现在而不是 foo(stdout_cm)
我正在尝试在我的数据库框架中管理事务(我使用 MongoDB 和 umongo 而不是 pymongo)。 要使用事务,必须沿整个调用链传递一个session kwarg。我想提供一个上下文管理器来隔
我正在使用 SQLAlchemy 的 provided contextmanager为我处理 session 。我不明白的是如何获取自动生成的 ID,因为(1)直到调用 commit() 之后才创建
我正在尝试编写一个带有上下文管理器的多线程助手。这个想法是在一个 block 内定义一堆函数,上下文管理器“神奇地”负责调度和一切。简化的工作版本如下所示: import contextlib @co
我有以下异步函数: async def my_func(request): # preparation code here with aiohttp.ClientSession() a
我们的 Python 代码库包含与指标相关的代码,如下所示: class Timer: def __enter__(self, name): self.name = name
克隆时 Aware在我的 Android Studio 中 repo ,同步 gradle,我收到以下消息: Failed to sync Gradle project 'app' Error:Cou
我是一名优秀的程序员,十分优秀!