Comment obtenir un nom de fonction en tant que chaîne de caractères en Python?

en Python, comment obtenir un nom de fonction comme chaîne de caractères sans appeler la fonction?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

devrait produire "my_function" .

est-ce Disponible en python? Si ce n'est pas le cas, comment écrire get_function_name_as_string en Python?

491
demandé sur APerson 2008-10-30 22:38:24
la source

9 ответов

my_function.__name__

par __name__ est la méthode préférée car elle s'applique uniformément. Contrairement à func_name , il fonctionne sur des fonctions intégrées ainsi:

>>> import time
>>> time.time.func_name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'builtin_function_or_method' object has no attribute 'func_name'
>>> time.time.__name__ 
'time'

le double soulignement indique aussi au lecteur qu'il s'agit d'un attribut spécial. En prime, les classes et les modules ont aussi un attribut __name__ , donc vous n'avez mémoriser qu'un nom spécial.

623
répondu user28409 2008-11-01 03:07:17
la source

vous pouvez également utiliser

import sys
this_function_name = sys._getframe().f_code.co_name
210
répondu Albert Vonpupp 2016-03-29 03:00:31
la source
my_function.func_name

il y a aussi d'autres propriétés amusantes des fonctions. Tapez dir(func_name) pour les énumérer. func_name.func_code.co_code est la fonction compilée, stockée sous forme de chaîne.

import dis
dis.dis(my_function)

affichera le code dans presque format lisible par l'humain. :)

36
répondu Markus Jarderot 2008-10-30 22:58:30
la source

cette fonction renvoie le nom de la fonction de l'appelant.

def func_name():
    import traceback
    return traceback.extract_stack(None, 2)[0][2]

c'est comme la réponse d'Albert Vonpupp avec un emballage amical.

28
répondu Demyn 2013-12-21 04:59:58
la source

sys._getframe () n'est pas garanti d'être disponible dans toutes les implémentations de Python ( voir ref ), vous pouvez utiliser le module traceback pour faire la même chose, par exemple.

import traceback
def who_am_i():
   stack = traceback.extract_stack()
   filename, codeline, funcName, text = stack[-2]

   return funcName

un appel à stack[-1] retournera les détails du processus en cours.

11
répondu sandyc 2013-08-31 04:45:54
la source

si vous êtes également intéressé par les méthodes de classe, Python 3.3+ a __qualname__ en plus de __name__ .

def my_function():
    pass

class MyClass(object):
    def method(self):
        pass

print(my_function.__name__)         # gives "my_function"
print(MyClass.method.__name__)      # gives "method"

print(my_function.__qualname__)     # gives "my_function"
print(MyClass.method.__qualname__)  # gives "MyClass.method"
9
répondu lapis 2017-11-07 13:48:04
la source

j'aime utiliser un décorateur de fonction. J'ai ajouté une classe, qui chronomètre également le temps de fonction. Supposons que gLog est un logger python standard:

class EnterExitLog():
    def __init__(self, funcName):
        self.funcName = funcName

    def __enter__(self):
        gLog.debug('Started: %s' % self.funcName)
        self.init_time = datetime.datetime.now()
        return self

    def __exit__(self, type, value, tb):
        gLog.debug('Finished: %s in: %s seconds' % (self.funcName, datetime.datetime.now() - self.init_time))

def func_timer_decorator(func):
    def func_wrapper(*args, **kwargs):
        with EnterExitLog(func.__name__):
            return func(*args, **kwargs)

    return func_wrapper

donc maintenant tout ce que vous avez à faire avec votre fonction est de décorer et voila

@func_timer_decorator
def my_func():
8
répondu radato 2016-07-19 11:37:30
la source

comme extension de réponse de @Demyn , j'ai créé quelques fonctions utilitaires qui impriment le nom de la fonction courante et les arguments de la fonction courante:

import inspect
import logging
import traceback

def get_function_name():
    return traceback.extract_stack(None, 2)[0][2]

def get_function_parameters_and_values():
    frame = inspect.currentframe().f_back
    args, _, _, values = inspect.getargvalues(frame)
    return ([(i, values[i]) for i in args])

def my_func(a, b, c=None):
    logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')')
    pass

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter(
    '%(asctime)s [%(levelname)s] -> %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)])
7
répondu Jim G. 2017-05-23 14:47:22
la source

vous voulez juste obtenir le nom de la fonction voici un code simple pour cela. disons que vous avez ces fonctions définies

def function1():
    print "function1"

def function2():
    print "function2"

def function3():
    print "function3"
print function1.__name__

la sortie sera fonction1

Maintenant, disons que vous avez ces fonctions dans une liste

a = [function1 , function2 , funciton3]

pour obtenir le nom des fonctions

for i in a:
    print i.__name__

la sortie sera

fonction1

fonction2

function3

2
répondu Muhammad Mohsin 2018-03-16 17:21:11
la source

Autres questions sur python string function