使用greenlet嵌套生成器

greengen的Python项目详细描述


格林根

greengen是一个python包,它允许实现生成器,而不必一直生成项。 相反,任何从greengen生成器调用的内部函数都可以直接向外部生成器生成项。

安装

pip install greengen

用法

例如,假设我们要实现一个函数,该函数执行一些繁重的业务逻辑,并生成日志。 我们希望在创建日志时立即处理它们。 但是我们的函数必须调用一个很深的helper函数堆栈,然后调用更多的函数, 日志可以写在任何函数中的任何地方。 使用常规生成器实现将非常烦人:

importtimedefdo_business_logic_and_yield_logs(some_input):yield from_helper_function(some_input)yield from_more_helper_function(some_input)def_helper_function(some_input):foriinrange(some_input):logs_and_result=_inner_helper_function(i)# Notice the enormous effort needed in order to retrieve the last result (using StopIteration etc.)whileTrue:try:yieldnext(logs_and_result)# This is a logexceptStopIterationase:result=e.value# This is the resultyieldlog('Result for {} is {}'.format(i,result))breakdef_more_helper_function(some_input):yield from_helper_function(some_input*100)yield from_helper_function(some_input**2)def_inner_helper_function(some_input):yieldlog('Started calculating')result=2**some_input# (Or whatever other heavy calculation)yieldlog('Finished calculating')returnresult# Will be raised as StopIterationdeflog(stuff):return{'message':str(stuff),'timestamp':time.time()}defmain():forlindo_business_logic_and_yield_logs(42):# Consume the logs however we wantprint('{}: {}'.format(l['timestamp'],l['message']))

使用greengen,此示例可以简化为以下内容:

importtimeimportgreengen@greengen.greengendefdo_business_logic_and_yield_logs(some_input):# Notice how we don't need the "yield from" anymore_helper_function(some_input)_more_helper_function(some_input)def_helper_function(some_input):foriinrange(some_input):# Notice how easy it is to retrieve the result nowresult=_inner_helper_function(i)log('Result for {} is {}'.format(i,result))def_more_helper_function(some_input):_helper_function(some_input*100)_helper_function(some_input**2)def_inner_helper_function(some_input):log('Started calculating')result=2**some_input# (Or whatever other heavy calculation)log('Finished calculating')returnresultdeflog(stuff):# This is the only place in the entire code where we need to be aware of the fact that we are inside a generator.# This will directly yield the log as the next item in the outer generator ("do_business_logic_and_yield_logs")greengen.yield_({'message':str(stuff),'timestamp':time.time()})defmain():forlindo_business_logic_and_yield_logs(42):# Consume the logs however we wantprint('{}: {}'.format(l['timestamp'],l['message']))

贡献

  1. 叉开!
  2. 创建功能分支:git checkout -b my-new-feature
  3. 提交更改:git commit -am 'Add some feature'
  4. 推到分支:git push origin my-new-feature
  5. 提交拉取请求:d

历史记录

TOdo:写入历史记录

学分

待办事项:写学分

许可证

TOdo:写入许可证

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何为ConcurrentHashMap使用并设置适当的并发级别?   java泛型方法,运行时错误,   java在页面上显示加载的图像   java Paypal定期直接支付问题   java如何延迟重新绘制组件   JavaSpringBoot+Hibernate如何维护@Transient字段   java在其方法中获取关于类的信息   在java中将别名添加到枚举   java如何解决向google报告成绩时“需要重新连接客户端”的问题   清晰的java图像背景   java未找到适合JDateChooser的构造函数(字符串、字符串、字符)   java LRU缓存实现。某些测试用例的代码失败   if语句Java嵌套的if/Else条件   java JSoup“wrap”并非每次都按预期工作   Java Spring引导循环依赖于一个环境   ssl证书无法通过Java和IntelliJ连接到SOAP服务   带整数验证的Java扫描器   java在Flex中呈现具有动态列的datagrid   java Android:通过用户选择的选项将文件上载到服务器   子类中的java抛出错误、异常和运行时异常