Python 将对象作为参数传递时,如何在使用;收益率;?

Python 将对象作为参数传递时,如何在使用;收益率;?,python,python-2.7,yield,Python,Python 2.7,Yield,仅出于说明目的使用以下代码时: 从uuid导入uuid4 类路由器(对象): def路线(自): res=response(jid=str(uuid4())) 工人=资源() 工人派遣(res) 打印“[jid:%s,状态:%s]”%(res.jid,res.status) 类响应(对象): 定义初始(自我,jid): self.jid=jid self.status=0 类资源(对象): 定义初始化(自): self.status=200 def调度(自我、res): res.status=自

仅出于说明目的使用以下代码时:

从uuid导入uuid4
类路由器(对象):
def路线(自):
res=response(jid=str(uuid4()))
工人=资源()
工人派遣(res)
打印“[jid:%s,状态:%s]”%(res.jid,res.status)
类响应(对象):
定义初始(自我,jid):
self.jid=jid
self.status=0
类资源(对象):
定义初始化(自):
self.status=200
def调度(自我、res):
res.status=自我状态
rs=‘好’
#返回rs
收益率
app=路由器()
app.route()
如果使用
return rs
而不是
yield rs
,我可以在资源类的
dispatch(self,res
)方法中更新status的值,output类似于:

[jid: 575fb301-1aa9-40e7-a077-87887c8be284, status: 200]
但是,如果使用
产生rs
我无法更新状态的值,我总是得到原始值,例如:

[jid: 575fb301-1aa9-40e7-a077-87887c8be284, status: 0]

因此,我想知道如何更新作为引用传递的对象的对象变量,当使用yield时,您需要迭代生成器。否则,将不执行生成器

>>> def gen():
...     print(1)
...     yield 'blah'
...     print(2)
...
>>> g = gen() # No print (not executed)
>>> next(g)   # print 1, yield `blah`. execution suspended.
1
'blah'
替换以下行:

worker.dispatch(res)
与:


通过使用
yield
您告诉python您的
dispatch()
方法是一个生成器

因此,当您调用
worker.dispatch(res)
时,实际上什么都没有发生(尝试调用
print worker.dispatch(res)
,您将看到的只是对象引用)

如falsetru所述,您必须对其进行迭代


另请参见

res.status
=>
rs.status
?如果有时我有收益,而其他人有回报,那么总是迭代是可以的?@nbari,我不理解你的意思
其他人有回报
。我的意思是,有时我会使用收益,其他人有回报,因此,我一直在想,总是使用类似于
的方法来处理uu-in-worker.dispatch(res):pass
,这样我就可以得到正确的结果,你觉得怎么样?@nbari,好的,我明白了。当您使用
return
时,不能更改返回值(除非返回值本身是一个可编辑的对象。)@nbari,关键是如果您在函数中使用
yield
,该函数将成为生成器函数。调用生成器函数不返回值,而是一个生成器。直到您使用
next
function/method或
send
method对生成器进行迭代或继续,生成器才会执行。
for rs in worker.dispatch(res):
    pass
next(worker.dispatch(res))