By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
440,772 Members | 935 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 440,772 IT Pros & Developers. It's quick & easy.

How can I programmatically find the name of a method from within that method?

P: n/a
Is there a way that I can programmatically find the name of a method I
have created from within that method? I would like to be able to log
a message from within that method (def) and I would like to include
the name of the method from which it was written without having to
hard-code that value in every message string. While we're at it, is
there a way to programmatically get the name of the class and the
module while I'm at it?

Thanks,

Aug 8 '07 #1
Share this Question
Share on Google+
9 Replies


P: n/a
kj7ny wrote:
Is there a way that I can programmatically find the name of a method I
have created from within that method? I would like to be able to log
a message from within that method (def) and I would like to include
the name of the method from which it was written without having to
hard-code that value in every message string. While we're at it, is
there a way to programmatically get the name of the class and the
module while I'm at it?
This is a frequently asked question around here :-)

You should search the list archives for past threads, e.g:
http://aspn.activestate.com/ASPN/Mai...n-list/3542665

-Jay
Aug 8 '07 #2

P: n/a
On Aug 7, 10:09 pm, Jay Loden <pyt...@jayloden.comwrote:
kj7ny wrote:
Is there a way that I can programmatically find the name of a method I
have created from within that method? I would like to be able to log
a message from within that method (def) and I would like to include
the name of the method from which it was written without having to
hard-code that value in every message string. While we're at it, is
there a way to programmatically get the name of the class and the
module while I'm at it?

This is a frequently asked question around here :-)

You should search the list archives for past threads, e.g:http://aspn.activestate.com/ASPN/Mai...n-list/3542665

-Jay
Thanks for the link. I had actually searched the past threads, but
apparently didn't enter the right search criteria because I did not
find that thread. Or, that thread isn't findable by searching Google
groups?

I tried the example in the interpreter and it appears to work.
Despite my years and years of programming in python, I am a bit
baffled by the example though. What is @checkPrivs (see example
copied below from other post)? In fact... how does the thing work at
all?

------------------------------------------
def checkPrivs(fn):
fnName = fn.func_name
def restricted(*args):
print "about to call function", fnName
if fnName in listOfAllowedFunctions:
return fn(*args)
else:
raise KeyError("you don't have sufficient privileges to do
THAT")
return restricted

listOfAllowedFunctions = ['add','subtract']

@checkPrivs
def add(a,b):
return a+b

@checkPrivs
def subtract(a,b):
return a-b

@checkPrivs
def multiply(a,b):
return a*b

add(1,2)
subtract(4,1)
multiply(3,2)

Aug 8 '07 #3

P: n/a
kj7ny wrote:
What is @checkPrivs (see example copied below from other post)? In
fact... how does the thing work at all?
@checkPrivs
def add(a,b):
return a+b
@... is called a decorator and is just a fancy way of writing

def add(a, b):
return a+b
add = checkPrivs(add)

Peter
Aug 8 '07 #4

P: n/a
On Aug 8, 8:25 am, Peter Otten <__pete...@web.dewrote:
kj7ny wrote:
What is @checkPrivs (see example copied below from other post)? In
fact... how does the thing work at all?
@checkPrivs
def add(a,b):
return a+b

@... is called a decorator and is just a fancy way of writing

def add(a, b):
return a+b
add = checkPrivs(add)

Peter
Is this cheating?

class a:
def square(self, x):

print 'executing:', dir(self)[-1]
print x*x
def cube(self, x):
print 'executing:', dir(self)[-2]
print x*x*x

b=a()

b.square(3)
b.cube(3)
Output:

PyMate r6780 running Python 2.3.5 (python)
>>function self naming2.py
executing: square
9
executing: cube
27

Aug 8 '07 #5

P: n/a
Tony wrote:
Is this cheating?
Isn't it harder to calculate the magic indices than just writing down the
names twice?
class a:
********def square(self, x):
****************print 'executing:', dir(self)[-1]
****************print x*x
********def cube(self, x):
****************print 'executing:',*****dir(self)[-2]
****************print x*x*x

b=a()
b.square(3)
b.cube(3)
Output:

PyMate r6780 running Python 2.3.5 (python)
>function self naming2.py

executing: square
9
executing: cube
27
Is this cheating?
No, just wrong.
>class A:
.... def alpha(self): return dir(self)[-2]
.... def gamma(self): return dir(self)[-1]
....
>>a = A()
a.alpha(), a.gamma()
('alpha', 'gamma')
>>a.beta = 42
a.alpha(), a.gamma()
('beta', 'gamma')

Peter
Aug 8 '07 #6

P: n/a
On Aug 8, 9:28 pm, Peter Otten <__pete...@web.dewrote:
No, just wrong.
class A:

... def alpha(self): return dir(self)[-2]
... def gamma(self): return dir(self)[-1]
...>>a = A()
>a.alpha(), a.gamma()
('alpha', 'gamma')
>a.beta = 42
a.alpha(), a.gamma()

('beta', 'gamma')

Peter
Only wrong if the function is only to write its own name. if it does
something else as well, seems to work:

class a:

def square(self, x):
print 'executing:', dir(self)[-1]
print x*x
def cube(self, x):
print 'executing:', dir(self)[-2]
print x*x*x

b=a()

b.cube(4),b.square(2)
b.c =4
b.cube(3), b.cube(2)

executing: cube
64
executing: square
4
executing: cube
27
executing: cube
8

cheers

Aug 8 '07 #7

P: n/a
On Aug 8, 12:45 am, kj7ny <kj...@nakore.comwrote:
Is there a way that I can programmatically find the name of a method I
have created from within that method? I would like to be able to log
a message from within that method (def) and I would like to include
the name of the method from which it was written without having to
hard-code that value in every message string. While we're at it, is
there a way to programmatically get the name of the class and the
module while I'm at it?

Thanks,
def foo():
print sys._getframe(0).f_code.co_name

most of the darkest magic of python is in the frames returned by
sys._getframe.

Aug 9 '07 #8

P: n/a
On Aug 8, 10:43 pm, faulkner <faulkner...@gmail.comwrote:
On Aug 8, 12:45 am, kj7ny <kj...@nakore.comwrote:
Is there a way that I can programmatically find the name of a method I
have created from within that method? I would like to be able to log
a message from within that method (def) and I would like to include
the name of the method from which it was written without having to
hard-code that value in every message string. While we're at it, is
there a way to programmatically get the name of the class and the
module while I'm at it?
Thanks,

def foo():
print sys._getframe(0).f_code.co_name

most of the darkest magic of python is in the frames returned by
sys._getframe.
sorry for the double-post. i forgot to answer the rest of the
question.

class a:
def b(self, *a):
print sys._getframe(0).f_code.co_name
print self.__class__.__name__
print getattr(self,
sys._getframe(0).f_code.co_name).im_class.__name__
print self.__class__.__module__

def log(f):
def newf(*a, **kw):
if a and f.func_code.co_varnames[0] == 'self': print '%s.%s.%s
%r %r' % (a[0].__class__.__module__, a[0].__class__.__name__,
f.func_name, a, kw)
else: print '%s.%s %r %r' % (f.func_globals['__name__'],
f.func_name, a, kw)
f(*a, **kw)
newf.__name__ = f.__name__
newf.__doc__ = f.__doc__
return newf

you can find more interesting attributes of frame and function objects
using the builtin dir function.

Aug 9 '07 #9

P: n/a
Tony wrote:
On Aug 8, 9:28 pm, Peter Otten <__pete...@web.dewrote:
>No, just wrong.
>class A:

... def alpha(self): return dir(self)[-2]
... def gamma(self): return dir(self)[-1]
...>>a = A()
>>a.alpha(), a.gamma()
('alpha', 'gamma')
>>a.beta = 42
a.alpha(), a.gamma()

('beta', 'gamma')

Peter
Only wrong if the function is only to write its own name. if it does
something else as well, seems to work:

class a:

********def square(self, x):
****************print 'executing:', dir(self)[-1]
****************print x*x
********def cube(self, x):
****************print 'executing:',*****dir(self)[-2]
****************print x*x*x

b=a()

b.cube(4),b.square(2)
b.c =4
b.cube(3), b.cube(2)
You mean

b.cube(3), b.square(2)
executing: cube
64
executing: square
4
executing: cube
27
executing: cube
8
Yeah, cargo cult programming, I love it.

dir() sorts attribute names alphabetically. Therefore the tail of the list
you are accessing will only be altered if you choose a name >
min(other_names), i. e. a name that comes after "cube" in the alphabet. Try
setting

b.root = 42

if you don't believe me.

Peter
Aug 9 '07 #10

This discussion thread is closed

Replies have been disabled for this discussion.