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

Miles Kaufmann milesck at umich.edu
Tue Jul 14 14:24:06 EDT 2009


On Jul 14, 2009, at 2:03 PM, 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()
>   AAAA
>   BBBB
>   CCCC
>
> 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?

def func1():
     ...
     while cond:
         ...
         for x in commoncode():
             yield x
         ...

See also:
  - PEP 380: http://www.python.org/dev/peps/pep-0380/
  - Stackless: http://www.stackless.com/

-Miles




More information about the Python-list mailing list