How to keep a function as a generator function when the yield operator is moved into its sub-functions??

2009-07-14 Thread weafon

Hi guys,

I have a question about the usage of yield. As shown in the below 
example, in general, if there is a code segment commonly used by two or 
more functions, we may isolate the segment into a function and then call 
it from other functions if necessary.


def func1():
   
   while(cond):
   .
   commoncode()
   ...


def func2():
   
   while(cond):
   .
   commoncode()
   ...

def commoncode()
   
   
   

However, if there is a 'yield' operation in the common code segment, the 
isolation causes that func1 and func2 become a non-generator function!! 
Although I can prevent such an isolation by just duplicating the segment 
in func1 and func2 to keep both of them being generator functions, the 
code may become ugly and hard to maintain particularly when coomoncode() 
is long.


The problem may be resolved if I can define the commoncode() as an 
inline function or marco. Unfortunately, inline and marco do not seems 
to be implemented in python. Thus, how can I isolate a common segment 
into a function when there are yield operations in the common segment?


Thanks,
Weafon





--
http://mail.python.org/mailman/listinfo/python-list


Re: How to keep a function as a generator function when the yield operator is moved into its sub-functions??

2009-07-15 Thread weafon

Hi DaveA,

Thank for your responses even though my problem has been solved based on 
Miles' suggestion. I am writing programs by using the SimPy library, 
which is a discrete-event simulator library. Below is my actual code segment


class RAID(Process):
   def ReqServ(self):
   while(now()In the above example, ReqServ may pause at three lines of yield and 
return something. However, if I move the code segment A into a second 
function as following, then ReqServ will not pause and return things 
back to its caller after calling SegmentA().


class RAID(Process):
   def ReqServ(self):
   while(now()Based on Miles's suggestion, we can solve the problem by using 'return' 
in SegmentA() and keeping 'yield' in ReqServ(). For example,


class RAID(Process):
   def ReqServ(self):
   while(now()
weafon wrote:

Hi guys,

I have a question about the usage of yield. As shown in the below 
example, in general, if there is a code segment commonly used by two 
or more functions, we may isolate the segment into a function and 
then call it from other functions if necessary.


def func1():
   
   while(cond):
   .
   commoncode()
   ...


def func2():
   
   while(cond):
   .
   commoncode()
   ...

def commoncode()
   
   
   

However, if there is a 'yield' operation in the common code segment, 
the isolation causes that func1 and func2 become a non-generator 
function!! Although I can prevent such an isolation by just 
duplicating the segment in func1 and func2 to keep both of them being 
generator functions, the code may become ugly and hard to maintain 
particularly when coomoncode() is long.


The problem may be resolved if I can define the commoncode() as an 
inline function or marco. Unfortunately, inline and marco do not 
seems to be implemented in python. Thus, how can I isolate a common 
segment into a function when there are yield operations in the common 
segment?


Thanks,
Weafon

You are implying there's something special or unique about yield in 
this.  Return has the same problem, and many other flow control 
constructs.   Also, variable definitions and scoping.


So you can't just copy any old bunch of adjacent lines out of two 
functions, put it into a third, and call it factoring.  Give us a 
specific example you're puzzled about, and we can try to solve it.


DaveA



--
http://mail.python.org/mailman/listinfo/python-list