Question Comment obtenir un nom de fonction sous forme de chaîne en Python?


En Python, comment obtenir un nom de fonction en tant que chaîne sans appeler la fonction?

def my_function():
    pass

print get_function_name_as_string(my_function) # my_function is not in quotes

devrait sortir "my_function".

Est-ce disponible en python? Si non, aucune idée comment écrire get_function_name_as_string en Python?


474
2017-10-30 19:38


origine


Réponses:


my_function.__name__

En utilisant __name__ est la méthode préférée car elle s'applique uniformément. contrairement à func_name, il fonctionne aussi sur les fonctions intégrées:

>>> 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'

De plus, les doubles soulignements indiquent au lecteur qu'il s'agit d'un attribut spécial. En prime, les classes et modules ont un __name__ attribut aussi, donc vous ne vous souvenez que d'un nom spécial.


593
2017-11-01 00:07



Vous pouvez également utiliser

import sys
this_function_name = sys._getframe().f_code.co_name

199
2017-11-22 13:59



my_function.func_name

Il y a aussi d'autres propriétés amusantes des fonctions. Type dir(func_name) pour les lister. 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'homme. :)


36
2017-10-30 19:39



Cette fonction renverra 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 une enveloppe amicale.


28
2017-12-21 00:59



sys._getframe () n'est pas garanti pour être disponible dans toutes les implémentations de Python (voir ref), vous pouvez utiliser le module de 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 à la pile [-1] renverra les détails du processus en cours.


11
2017-08-31 00:34



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"

8
2017-11-07 10:48



J'aime utiliser un décorateur de fonction. J'ai ajouté une classe, qui multiplie également le temps de la fonction. Supposons que gLog soit un enregistreur de 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

alors maintenant tout ce que vous avez à faire avec votre fonction est la décorer et le tour est joué

@func_timer_decorator
def my_func():

7
2017-07-19 08:37



En tant que prolongement de @ La réponse de Demyn, J'ai créé quelques fonctions utilitaires qui impriment le nom de la fonction en cours et les arguments de la fonction en cours:

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)])

6
2018-03-25 21:21



Vous voulez juste obtenir le nom de la fonction ici est 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
fonction3


1
2018-03-16 14:21