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

Dave Angel davea at ieee.org
Tue Jul 14 23:32:21 EDT 2009


weafon wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">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?
>
> 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




More information about the Python-list mailing list