41 votes

Comment puis-je obtenir le nom d'une fonction ou d'une méthode depuis une fonction ou une méthode Python?

J'ai l'impression que je devrais le savoir, mais je n'ai pas été capable de le comprendre ...

Je souhaite obtenir le nom d'une méthode - qui se trouve être un test d'intégration - de l'intérieur afin de pouvoir imprimer du texte de diagnostic. Je peux bien sûr coder en dur le nom de la méthode dans la chaîne, mais j'aimerais que le test soit un peu plus sec si possible.

55voto

mhawke Points 10385

Cela semble être le moyen le plus simple d'utiliser le module inspect :

 import inspect
def somefunc(a,b,c):
    print "My name is: %s" % inspect.stack()[0][3]
 

Vous pouvez généraliser ceci avec:

 def funcname():
    return inspect.stack()[1][3]

def somefunc(a,b,c):
    print "My name is: %s" % funcname()
 

Merci à Stefaan Lippens, qui a été trouvé via google.

23voto

spiv Points 1488

Les réponses impliquant une introspection via inspect et autres sont raisonnables. Mais il peut y avoir une autre option, selon votre situation:

Si votre test d'intégration est écrit avec le module unittest , vous pouvez utiliser self.id() dans votre TestCase.

16voto

nosklo Points 75862

Ce décorateur a fait le nom de la méthode de la disposition à l'intérieur de la fonction en lui passant comme argument mot-clé.

from functools import wraps
def pass_func_name(func):
    "Name of decorated function will be passed as keyword arg _func_name"
    @wraps(func)
    def _pass_name(*args, **kwds):
        kwds['_func_name'] = func.func_name
        return func(*args, **kwds)
    return _pass_name

Vous pouvez l'utiliser de cette façon:

@pass_func_name
def sum(a, b, _func_name):
    print "running function %s" % _func_name
    return a + b

print sum(2, 4)

Mais peut-être que vous voulez écrire ce que vous voulez directement à l'intérieur du décorateur lui-même. Ensuite, le code est un exemple de la façon d'obtenir le nom de la fonction dans un décorateur. Si vous donnerons plus de détails sur ce que vous voulez faire dans la fonction, qui exige que le nom, peut-être que je peux suggérer quelque chose d'autre.

10voto

Kevin Little Points 5406
 # file "foo.py" 
import sys
import os

def LINE( back = 0 ):
    return sys._getframe( back + 1 ).f_lineno
def FILE( back = 0 ):
    return sys._getframe( back + 1 ).f_code.co_filename
def FUNC( back = 0):
    return sys._getframe( back + 1 ).f_code.co_name
def WHERE( back = 0 ):
    frame = sys._getframe( back + 1 )
    return "%s/%s %s()" % ( os.path.basename( frame.f_code.co_filename ),     
                            frame.f_lineno, frame.f_code.co_name )

def testit():
   print "Here in %s, file %s, line %s" % ( FUNC(), FILE(), LINE() )
   print "WHERE says '%s'" % WHERE()

testit()
 

Sortie:

 $ python foo.py
Here in testit, file foo.py, line 17
WHERE says 'foo.py/18 testit()'
 

Utilisez "back = 1" pour trouver des informations sur les deux niveaux de la pile, etc.

3voto

Greg Hewgill Points 356191

Je pense que le module traceback pourrait avoir ce que vous cherchez. En particulier, la fonction extract_stack semble faire l'affaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X