标签: generator

试图理解node.js中的生成器/产量 - 什么执行异步函数?

Node.js现在有了生成器.

我的理解是,生成器可用于编写看起来更加线性的代码,并避免回调地狱和厄运风格编码的金字塔.

所以到目前为止,我的理解是在生成器内部,代码执行直到达到"yield"语句.此时暂停执行生成器功能.该yield语句指定一个返回值,该值可以是一个函数.通常,这将是一个阻塞I/O函数 - 通常需要异步执行的函数.

yield的返回函数返回到任何称为生成器的函数.

我的问题是,此时会发生什么?究竟是什么执行了yield返回的阻塞I/O函数?

编写看似线性的生成器/良品代码是正确的,需要有一种特定类型的函数来调用生成器,这是一个循环生成器并执行yield返回的每个异步函数的函数并返回异步功能返回发电机的结果?

我仍然不清楚如何执行yield返回的asynch函数.如果它由调用生成器的函数执行,它是否异步执行?我猜是因为否则会导致阻塞行为.

总结一下我的问题:

  1. 要用生成器编写"线性"异步代码,是否需要有一个遍历生成器的调用函数,执行生成函数作为回调并将回调结果返回给生成器?
  2. 如果问题1的答案是肯定的,那么生成的函数究竟是如何执行的 - 异步?

任何人都可以提供更好的概述/总结整个过程的工作原理吗?

yield generator node.js

17
推荐指数
1
解决办法
1万
查看次数

如何在打字稿中使用生成器函数

我试图在打字稿中使用生成器函数.但编译器会抛出错误

error TS2339: Property 'next' does not exist on type

下面是我最接近的代码示例.

export default class GeneratorClass {
    constructor() {
        this.generator(10);
        this.generator.next();
    }
    *generator(count:number): Iterable<number | undefined> {
        while(true)
            yield count++;
    }   
}
Run Code Online (Sandbox Code Playgroud)

这是同一个游乐场的链接

javascript generator typescript ecmascript-6

17
推荐指数
3
解决办法
2万
查看次数

如何覆盖gem中的rails生成器模板?

如果要覆盖生成器模板(不替换生成器本身),在Rails 3中,您只需将文件放在lib/templates中相应命名的位置,Rails就会找到它们.

如果你想用宝石做这件事怎么办?我正在尝试采用我的团队的标准化脚手架格式并对其进行创建,以便我们可以在所有项目中共享它并轻松更新,而不是将文件复制到每个项目的lib /中.这适用于我创建新生成器的情况; 我用application.rb中的config.generators挂钩,然后Rails找到它.但是当我将模板文件放入gem中的lib/templates时,Rails首先找到它自己的默认模板,然后渲染它们而不是我的.我认为搜索顺序是RAILS_ROOT/lib/templates,RAILS_GEMS/lib/templates,OTHER_GEMS/lib/templates.

解决方案是什么?我在这方面找不到很多docco,并且通过Rails进行代码跳转没有提供明显的解决方案.谢谢!

gem templates generator ruby-on-rails-3

16
推荐指数
2
解决办法
2139
查看次数

如何在耗尽时让生成器/迭代器评估为False?

Python中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?

python iterator boolean generator

16
推荐指数
2
解决办法
3576
查看次数

在Rails中禁用单元测试生成器

有谁知道如何禁用Rails中的自动单元测试文件生成?无论何时创建控制器,模型或迁移,它都会在test /目录中创建关联文件; 我需要这个禁用.

另外,当执行标准的rails g model | controller | migration命令时,是否可以使RPsec接管以便使用RSpec(在spec /目录中)创建文件?

unit-testing rspec ruby-on-rails generator

16
推荐指数
1
解决办法
6608
查看次数

在python中深度复制生成器

我正在使用发电机功能,说:

def foo():
    i=0
    while (i<10):
         i+=1
         yield i
Run Code Online (Sandbox Code Playgroud)

现在,我希望选择在任意次数的迭代后复制生成器,以便新副本将保留内部状态(在示例中将具有相同的"i"),但现在将独立于原始状态(即迭代)副本不应该改变原来的).

我尝试过使用copy.deepcopy但是我得到了错误:

 "TypeError: object.__new__(generator) is not safe, use generator.__new__()"   
Run Code Online (Sandbox Code Playgroud)

显然,我可以使用带有计数器的常规函数​​来解决这个问题.但我真的在寻找使用发电机的解决方案.

python generator

16
推荐指数
2
解决办法
5422
查看次数

关于协程的itertools.tee?

我有一个对象的树形结构.我需要遍历叶子中的所有项目("值").为此,我目前正在使用如下所示的生成器方法:

class Node(object):
    def __init__(self):
        self.items = [Leaf(1), Leaf(2), Leaf(3)]

    def values(self):
        for item in self.items:
            for value in item.values():
                yield value

class Leaf(object):
    def __init__(self, value):
        self.value = value

    def values(self):
        for i in range(2):
            yield self.value

n = Node()
for value in n.values():
    print(value)
Run Code Online (Sandbox Code Playgroud)

这打印:

1
1
2
2
3
3
Run Code Online (Sandbox Code Playgroud)

现在,a返回的值Leaf将取决于外部参数.我正在考虑使用协程能够将此参数传递给叶节点:

import itertools

class Node2(object):
    def __init__(self):
        self.items = [Leaf2(1), Leaf2(2), Leaf2(3)]

    def values(self):
        parameter = yield
        for item in self.items:
            item_values = item.values()
            next(item_values) …
Run Code Online (Sandbox Code Playgroud)

python generator coroutine tee python-itertools

16
推荐指数
1
解决办法
626
查看次数

从JSON文档生成AVRO模式

是否有任何工具能够从"典型的"JSON文档创建AVRO模式.

例如:

{
"records":[{"name":"X1","age":2},{"name":"X2","age":4}]
}
Run Code Online (Sandbox Code Playgroud)

我找到了http://jsonschema.net/reboot/#/,它生成了一个' json-schema '

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net#",
  "type": "object",
  "required": false,
  "properties": {
    "records": {
      "id": "#records",
      "type": "array",
      "required": false,
      "items": {
        "id": "#1",
        "type": "object",
        "required": false,
        "properties": {
          "name": {
            "id": "#name",
            "type": "string",
            "required": false
          },
          "age": {
            "id": "#age",
            "type": "integer",
            "required": false
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但我想要一个AVRO版本.

schema json generator avro

16
推荐指数
1
解决办法
8537
查看次数

生成器表达式Python

我有一个字典列表,如下所示:

lst = [{'a': 5}, {'b': 6}, {'c': 7}, {'d': 8}]
Run Code Online (Sandbox Code Playgroud)

我写了一个生成器表达式,如:

next((itm for itm in lst if itm['a']==5))
Run Code Online (Sandbox Code Playgroud)

现在奇怪的是,虽然这适用于它的键值对,'a' 但下次会为所有其他表达式抛出错误.表达:

next((itm for itm in lst if itm['b']==6))
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
KeyError: 'b'
Run Code Online (Sandbox Code Playgroud)

python dictionary generator generator-expression

16
推荐指数
3
解决办法
2677
查看次数

生成器理解表达式之间的差异

据我所知,有三种通过理解创建生成器的方法1.

经典之一:

def f1():
    g = (i for i in range(10))
Run Code Online (Sandbox Code Playgroud)

yield变种:

def f2():
    g = [(yield i) for i in range(10)]
Run Code Online (Sandbox Code Playgroud)

yield from变体(即提出了SyntaxError除了一个函数的内部):

def f3():
    g = [(yield from range(10))]
Run Code Online (Sandbox Code Playgroud)

这三种变体导致不同的字节码,这并不奇怪.第一个是最好的,这似乎是合乎逻辑的,因为它是通过理解创建生成器的专用,直接的语法.但是,它不是产生最短字节码的那个.

在Python 3.6中反汇编

经典的发电机理解

>>> dis.dis(f1)
4           0 LOAD_CONST               1 (<code object <genexpr> at...>)
            2 LOAD_CONST               2 ('f1.<locals>.<genexpr>')
            4 MAKE_FUNCTION            0
            6 LOAD_GLOBAL              0 (range)
            8 LOAD_CONST               3 (10)
           10 CALL_FUNCTION            1
           12 GET_ITER
           14 CALL_FUNCTION            1
           16 STORE_FAST               0 (g) …
Run Code Online (Sandbox Code Playgroud)

python generator generator-expression

16
推荐指数
1
解决办法
850
查看次数