<p dir="ltr">On Dec 26, 2012 11:55 PM, "Abhas Bhattacharya" <<a href="mailto:abhasbhattacharya2@gmail.com">abhasbhattacharya2@gmail.com</a>> wrote:<br>
><br>
> On Thursday, 27 December 2012 10:22:15 UTC+5:30, Tim Roberts  wrote:<br>
> > Abhas Bhattacharya <<a href="mailto:abhasbhattacharya2@gmail.com">abhasbhattacharya2@gmail.com</a>> wrote:<br>
> ><br>
[Oh god please stop/avoid using Google Groups with its godawful reply-quoting style that adds excessive blank lines]<br>
> > >While I am defining a function, how can I access the name (separately as<br>
> > >string as well as object) of the function without explicitly naming<br>
> > >it(hard-coding the name)?<br>
> > >For eg. I am writing like:<br>
> ><br>
> > >def abc():<br>
> > >    #how do i access the function abc here without hard-coding the name?<br>
> ><br>
> > Why?  Of what value would that be?<br>
<snip><br>
> Because I have this situation:<br>
> I have used a dictionary with "function_name":value pair in the top of the code. Now when some function is called, I need to print the value assigned to its name in the dictionary (the functions are defined after the dictionary). Now there is only one bad way-around for me: I need to hard-code the name in the function like this:<br>

> def function_name():<br>
>     print(dict_name.get("function_name"))<br>
> but ofcourse it is a bad thing to do because I have a lot of this type of  functions. It would be better if I can can use the same code for all of them, because they are all essentially doing the same thing.</p>
<p dir="ltr">I agree with the general outline of Mitya's suggestion, i.e. refactor the "print the associated value" step into a separate function, thus obviating the self-reference issue; it'd be bad to repeat that code in each function anyway.</p>

<p dir="ltr">Anyhow, here's a simple variation that exploits decorators (because they're generally awesome & one of my favorite features):</p>
<p dir="ltr">def printing_name_beforehand(func):<br>
    def wrapper(*args, **kwargs):<br>
        print(the_dict.get(func.__name__))<br>
        return func(*args, **kwargs)<br>
    return wrapper</p>
<p dir="ltr">Usage:</p>
<p dir="ltr">@printing_name_beforehand<br>
def some_func(...):<br>
    # whatever<br></p>
<p dir="ltr">(Forgive me if there are typos; composing this reply on a tablet is cumbersome.)</p>