SMS
SMS

Reputation: 382

pass return of a function into another

I have a question / problem and I don't know how to solve it. Suppose you have three functions, function 1, function 2 and function 3. In function 1 you do some operations and you give a specific return which will be used as input for the second function. In the second function you do some specific calculation and also finish with return, which you pass in a third function

My problem is that as soon as I pass the return of function 1 into function 2 all the calculation in function 1 is repeated (calculation is here in this case, several plots) The same goes for function two into three, now I get results from function 1 and function 2. I hope you do understand what I mean.

What I want is just the return value of func 1 for func 2 and return value of func 2 for three and not the entire function body.

Here is what my code looks like:

class test:
    def __(self)__:
        self.attribute1=pd.read_csv(...)
        self.attribite2=pd.read_csv(...)

    def func1(self):
        plt.plot(a,b)
        plt.plot(c,d)
        return x

    def func2(self):
        self.data_2=self.func1()
        plt.plot(e,f)
        plt.plot(g,h)
        return y

    def func3(self):
        self.data_3=self.func2()
        plt.plot(i,j)

data_test=test()
print(data_test.func2())

My problem is that (let's focus on func2). If I use the input from func1 and execute my code for func2 I get also the two plots. I dont want to have that. I just want to see the plots(e,f) and plots(g,h) instead of plots(a,b), plots(c,d), plots(e,f) and plots(g,h)

Upvotes: 0

Views: 76

Answers (2)

Hrabal
Hrabal

Reputation: 2523

Your class definition do not follow the OOP clean design, for which every method should performa the most atomic task possible.

Your methods func1, func2 and func3, they all do at least 2 tasks: plot something and return something else.

Consider changing your class so every method do one and only one thing, defining public APIS and private methods, for instance:

class test:
    def __(self)__:
        self.attribute1 = []
        self.attribite2 = []

    def _func1(self):
        return x

    def _func2(self):
        self.data_2 = self._func1()
        return y

    def _func3(self):
        self.data_3 = self._func2()

    def func2(self):
        self._func2()
        plt.plot(e,f)
        plt.plot(g,h)

    def func3(self):
        self._func3()
        plt.plot(e,f)
        plt.plot(g,h)

data_test=test()
data_test.func2()

This way func2 and func3 are public apis (aka: intended to be called from outside the class) that will "do the work" (setting stuff in self.data_2 and self.data_3) AND plot; while _func2 and _func3 are private methods (aka, methods that only the class itself is supposed to use) will only do the work. Now, calling func2 will use methods _func1 and _func2, but only plot what's defined in func2.

Upvotes: 1

molbdnilo
molbdnilo

Reputation: 66459

You say that you "pass the return of function 1 into function 2", but you never do that.

You're not passing any results anywhere, and none of your functions take any input (except self) - you're calling the functions directly in each one.
In other words, every time you call function2, it calls function1, and every time you call function3, it calls function2, which in turn calls function1.

Code that matches your description would look like this:

class test:
    def __(self)__:
        self.attribute1=pd.read_csv(...)
        self.attribite2=pd.read_csv(...)

    def func1(self):
        plt.plot(a,b)
        plt.plot(c,d)
        return x

    def func2(self, a):
        self.data_2 = a
        plt.plot(e,f)
        plt.plot(g,h)
        return y

    def func3(self, x):
        self.data_3 = x
        plt.plot(i,j)
        return z

data_test = test()
print(data_test.func3(data_test.func2(data_test.func1())))

Upvotes: 1

Related Questions