Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivalent of __func__ (from C) in Python

I want to create some kind of debugging output for python and want to pass the functionname to another function for output.

The only reasonable way I found to do so was:

def foobar():
  print 'hello world'

  print foobar.__name__

is there something that does the same thing for the current function to improve copy and pasting of that line?

like the C equivalent printf("%s", __func__).

like image 441
Alexander Oh Avatar asked Jan 06 '12 14:01

Alexander Oh


Video Answer


3 Answers

One thing you could try is to create a decorator that does this:

def traceme(func):
  def newfunc(*args, **kwargs):
    ret = func(*args, **kwargs)
    print func.__name__
    return ret
  return newfunc

@traceme
def foobar():
  print 'hello world'
like image 193
Krumelur Avatar answered Oct 16 '22 12:10

Krumelur


sys._getframe can do that:

import sys

def foobar():
    print sys._getframe().f_code.co_name
like image 9
David Robinson Avatar answered Oct 16 '22 12:10

David Robinson


Well, yes, there is a way...

print sys._getframe().f_code.co_name

You can even make it a function (getting the name of the previous frame):

def function_name():
    return sys._getframe().f_back.f_code.co_name

Silly example just to show that it works:

>>> def bar():
...     return function_name()
... 
>>> bar()
'bar'

(Note that the decorator shown in Krumelur's answer is a much better solution to the problem, but it is possible to do what you want in Python =)

like image 8
cha0site Avatar answered Oct 16 '22 12:10

cha0site