Malonge
Malonge

Reputation: 2040

How to tell when a method is called for first time of many

I would like to be able to tell when a method has been called for the first time. I primarily need this for when I am printing out to a delimited file, and if it is the first iteration, I would like to print a header before the actual information. This is what I normally do:

def writeFile(number, count):
    if count == 1:
        print('number')
        print(str(count))
    else:
        print(str(count))


count = 1
for i in range(10):
    writeFile(i, count)
    count += 1

This provides the following output:

number
1
2
3
4
5
6
7
8
9
10

Though this achieves the goal I am after, I am curious as to if there is a better/more efficient way of doing this. Is there some way to detect if a method has been called for the first time without having to pass an additional argument to it?

Thank you,

Upvotes: 7

Views: 9811

Answers (3)

dteod
dteod

Reputation: 331

This is a bit more deep respect to the other answers but I prefer it since it uses the OOP-ness of Python, the idea is to assign to the function itself the "called" variable: this can be done since everything in Python is an object (even a function inside its own scope).

The concept can be extended also to functions defined in other scopes - besides class scope - as well.

class SampleClass:
    def sample(self, *args, **kwargs):
        try:
            if self.__class__.sample.called:
                # do what you have to do with the method 
                print("normal execution")
        except AttributeError:
            # do what you have to do with the first call
            print("first call")
            self.__class__.sample.called = True
            self.__class__.sample(self, *args, **kwargs)

Example:

>>>SampleClass().sample()
first call
normal execution
>>>SampleClass().sample()
normal execution

Upvotes: 4

dwn
dwn

Reputation: 563

There are multiple ways to do this. Here are three.

First:

firstRun=True
def writeFile(number):
    global firstRun
    if firstRun:
        print('number')
        firstRun=False
    print(str(number))

for i in range(10):
    writeFile(i)

Second:

def writeFile(number):
    print(str(number))

for i in range(10):
    if not i:
        print('number')
    writeFile(i)

Third:

for i in range(10):
    print(('' if i else 'number\n')+str(i))

I'm assuming this is just a test problem meant to indicate cases where function calls initialize or reset data. I prefer ones that hide the information from the calling function (such as 1). I am new to Python, so I may be using bad practices.

Upvotes: 7

I'm Root James
I'm Root James

Reputation: 6515

You could write the header to the file before you call the function. That would negate your need for the if statements. I'm a basic level programmer, but this seems logical to me. For example:

def writeFile(count):
    print(str(count))

print('number')
for i in range(10):
    writeFile(i)

Upvotes: 5

Related Questions