How to keep a function as a generator function when the yield operatoris moved into its sub-function

W

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()
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
 
D

Diez B. Roggisch

weafon said:
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!!


No. Not writing them as generators makes them a non-generator-function.

You are way to unspecific with your examples. But if func1 and func2 are
themselves supposed to be generators, there is nothing preventing you
from using them as such.

Diez
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,007
Latest member
obedient dusk

Latest Threads

Top