Как получить имя функции в виде строки в Python?
в Python, как я могу получить имя функции в виде строки без вызова функции?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
вывести "my_function".
это доступно в python? Если нет, то любая идея, как написать get_function_name_as_string в Python?
9 ответов:
my_function.__name__используя
__name__является предпочтительным методом, поскольку он распространяется равномерно. В отличие отfunc_name, Он также работает на встроенных функциях:>>> 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'также двойные подчеркивания указывают читателю, что это специальный атрибут. В качестве бонуса, классы и модули
__name__атрибут тоже, так что вы помните только одно специальное имя.
my_function.func_nameесть и другие интересные свойства функций. Типа
dir(func_name)перечислить их.func_name.func_code.co_code- это скомпилированная функция, записанная в виде строки.import dis dis.dis(my_function)отобразит код в почти человек читаемый формат. :)
эта функция возвращает имя вызывающей функции.
def func_name(): import traceback return traceback.extract_stack(None, 2)[0][2]это похоже на ответ Альберта Вонпуппа с дружественной оберткой.
sys._getframe () не гарантируется быть доступным во всех реализациях Python ( см. ref), вы можете использовать модуль трассировки, чтобы сделать то же самое, например.
import traceback def who_am_i(): stack = traceback.extract_stack() filename, codeline, funcName, text = stack[-2] return funcNameвызов stack[-1] вернет текущие детали процесса.
Если вы тоже заинтересованы в методах класса, Python 3.3+ имеет
__qualname__кроме__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"
мне нравится использовать функцию декоратора. Я добавил класс, который также умножает время функции. Предположим, что gLog-это стандартный регистратор python:
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Так что теперь все, что вам нужно сделать с вашей функцией украсить его и вуаля
@func_timer_decorator def my_func():
расширения @Demyn это, Я создал некоторые служебные функции, которые печатают имя текущей функции и аргументы текущей функции:
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)])
вы просто хотите, чтобы получить имя функции, вот простой код для этого. допустим, у вас есть эти функции определены
def function1(): print "function1" def function2(): print "function2" def function3(): print "function3" print function1.__name__выход будет function1
Теперь Пусть говорят, что у вас есть эти функции в списке
a = [function1 , function2 , funciton3]чтобы получить имя функции
for i in a: print i.__name__выход будь
function1
function2
function3
Comments