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?
9 réponses
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.
vous pouvez également utiliser
import sys
this_function_name = sys._getframe().f_code.co_name
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. :)
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.
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.
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"
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():
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)])
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