Node.js现在有了生成器.
我的理解是,生成器可用于编写看起来更加线性的代码,并避免回调地狱和厄运风格编码的金字塔.
所以到目前为止,我的理解是在生成器内部,代码执行直到达到"yield"语句.此时暂停执行生成器功能.该yield语句指定一个返回值,该值可以是一个函数.通常,这将是一个阻塞I/O函数 - 通常需要异步执行的函数.
yield的返回函数返回到任何称为生成器的函数.
我的问题是,此时会发生什么?究竟是什么执行了yield返回的阻塞I/O函数?
编写看似线性的生成器/良品代码是正确的,需要有一种特定类型的函数来调用生成器,这是一个循环生成器并执行yield返回的每个异步函数的函数并返回异步功能返回发电机的结果?
我仍然不清楚如何执行yield返回的asynch函数.如果它由调用生成器的函数执行,它是否异步执行?我猜是因为否则会导致阻塞行为.
总结一下我的问题:
任何人都可以提供更好的概述/总结整个过程的工作原理吗?
我试图在打字稿中使用生成器函数.但编译器会抛出错误
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)
如果要覆盖生成器模板(不替换生成器本身),在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进行代码跳转没有提供明显的解决方案.谢谢!
Python中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?
有谁知道如何禁用Rails中的自动单元测试文件生成?无论何时创建控制器,模型或迁移,它都会在test /目录中创建关联文件; 我需要这个禁用.
另外,当执行标准的rails g model | controller | migration命令时,是否可以使RPsec接管以便使用RSpec(在spec /目录中)创建文件?
我正在使用发电机功能,说:
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)
显然,我可以使用带有计数器的常规函数来解决这个问题.但我真的在寻找使用发电机的解决方案.
我有一个对象的树形结构.我需要遍历叶子中的所有项目("值").为此,我目前正在使用如下所示的生成器方法:
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) 是否有任何工具能够从"典型的"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版本.
我有一个字典列表,如下所示:
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) 据我所知,有三种通过理解创建生成器的方法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) generator ×10
python ×5
avro ×1
boolean ×1
coroutine ×1
dictionary ×1
ecmascript-6 ×1
gem ×1
iterator ×1
javascript ×1
json ×1
node.js ×1
rspec ×1
schema ×1
tee ×1
templates ×1
typescript ×1
unit-testing ×1
yield ×1