最简单的办法还是用 flask-socketio,这个库我也用了一年多了,在树莓派上运行的也相当稳定,如果报错,你还是应该检查一下你的代码本身有没有问题,而不是怀疑类库
@
ysc3839 貌似只是在使用 HTTP/2 协议的时候才会显示小写的 Response Headers
@
wisej 不是还有各种钩子么,比如 app.before_request 之类的
@
billion 在 Py3 中如果你写成(x for x in range (10)) 则不会,如果写成[x for x in range (10)]就会
@
GeruzoniAnsasu 好吧,还真的是,不过这样两层迭代器嵌套也没啥意思。。
>>> ( x for x in range (10) )
<generator object <genexpr> at 0x000001F09127FFC0>
>>> ii = zip(range(1,6),range(6,11),range(11,16))
>>> i = iter(ii)
>>> next(i)
(1, 6, 11)
>>> next(i)
(2, 7, 12)
>>> next(i)
(3, 8, 13)
>>> next(i)
(4, 9, 14)
>>> next(i)
(5, 10, 15)
>>> next(i)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
@
GeruzoniAnsasu 其实你这段代码的前两行并不用把 range 对象转换成 tuple 的,直接 zip()即可,这样能大幅度减少内存占用
a = range(1,6)
b = range(6,11)
c = range(11,16)
d = [iter(a),iter(b),iter(c)]
def y():
----while True:
--------for m in d:
------------yield next(m)
for i in y():
----print(i)
>>> a = range(1,6)
>>> b = range(6,11)
>>> c = range(11,16)
>>>
>>> d = [a.__iter__(),b.__iter__(),c.__iter__()]
>>>
>>> def y():
... while True:
... for m in d:
... yield next(m)
...
>>> for i in y():
... print(i)
...
a = range(1,6)
b = range(6,11)
c = range(11,16)
def y():
----while True:
--------yield a.__next__()
--------yield b.__next__()
--------yield c.__next__()
for i in y():
----print(i)
我怎么觉得问题在这里
print(f.read())
return json.loads(f.read())
你读了两遍,写的时候却只写了一遍
@
saximi 的确“使用 getattr 本身并不等于死循环”,但是如果调用父类的__getattr__会在最大层面上避免出现递归循环
第二,我说的不要直接用 getattr 是对于 self 这个对象的,即不要在你自己的__getattr__调用
self.xxx 或者 getattr(self,"xxx"),你的代码应该改成 return getattr(super(self,类名).__getattr__("wrapped"),attr)这样才不会导致死循环
在__getattr__中永远不要直接使用 getattr()或者
self.xxx ,应该使用 super(self,类名).__getattr__来访问
@
irexy 你应该看看生成的汇编,你在编译 cout a 的时候 a 就已经被直接替换成 1 了,所以并不会被改变,类似于#define 的效果
另外就是你的第一段代码如果用 GCC 的-O3 编译的话,编译器甚至都可以推测出来这里的值为 3
.file "test.cpp"
.text
.p2align 2,,3
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
leal -4(%ebp), %eax
leave
ret
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d\12\0"
.text
.p2align 2,,3
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
call ___main
subl $8, %esp
pushl $3
pushl $LC0
call _printf
xorl %eax, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
如果你想探根究底的话,就看看 GCC 生产的汇编
.file "test.cpp"
.text
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $3, -8(%ebp)
leal -8(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $20, %esp
call ___main
call __Z1fv
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
movl (%eax), %eax
subl $8, %esp
pushl %eax
pushl $LC0
call _printf
addl $16, %esp
movl $0, %eax
movl -4(%ebp), %ecx
leave
leal -4(%ecx), %esp
ret
.def _printf; .scl 2; .type 32; .endef
看懂了这段汇编就能解释为什么函数结束了还能访问到那个 3 了