KcH
KcH

Reputation: 3502

How to pass one same value as argument to two methods?

I have a simple class as:

connection has db connection

import pandas as pd
from animal import kettle
class cat:
    def foo(connection):
        a=pd.read_sql('select * from zoo',connection)
        return1= kettle.boo1(a)
        return2= kettle.boo2(a)
        return return1,return2

Now I want to pass a to both boo1 and boo2 of kettle, am I passing it the correct way in above foo()?

I thought above way is correct and I tried this way , but is this correct way to pass?

animal.py:

class kettle:
    def boo1(return1):
         print(return1)

    def boo2(return2):
        print(return2)

sorry if this doesn't make any sense, my intention is passing a to both boo1 and boo2 of kettle class

Upvotes: 0

Views: 59

Answers (2)

Arthur_J
Arthur_J

Reputation: 66

There are (many) possible solutions for your problem, whatever that might be. I assume you just start out object oriented programming in Python, and get errors along the lines of

unbound method boo1() must be called with kettle instance as first argument

and probably want this solution:

Give your class methods an instance parameter:

def boo1(self, return1):

Instantiate the class kettle in cat.foo:

k = kettle()

Then use it like:

k.boo1(a)

Same for the boo2 method.

Also you probably want to:

return return1  # instead of or after print(return1)

as your methods return None at the moment.

Upvotes: 0

Dylan Goldsborough
Dylan Goldsborough

Reputation: 313

This looks like the correct approach to me: by assigning the return value of pd.read_sql('select * from zoo', connection) to a first and then passing a to kettle.boo1 and kettle.boo2 you ensure you only do the potentially time-consuming database IO only once.

One thing to keep in mind with this design pattern when you are passing objects such as lists/dicts/dataframes is the question of whether kettle.boo1 changes the value that is in a. If it does, kettle.boo2 will receive the modified version of a as an input, which can lead to unexpected behavior.

A very minimal example is the following:

>>> def foo(x):
...     x[0] = 'b'
...
>>> x = ['a']  # define a list of length 1
>>> foo(x)  # call a function that modifies the first element in x
>>> print(x)  # the value in x has changed
['b']

Upvotes: 1

Related Questions