Kaip gauti funkcijų pavadinimą kaip eilutę Python?

Python'e, kaip aš galiu gauti funkcijos pavadinimą kaip eilutę be skambinimo funkcijai?

 def my_function(): pass print get_function_name_as_string(my_function) # my_function is not in quotes 

turėtų pateikti "my_function" .

Ar tokia funkcija yra „Python“? Jei ne, kokias idėjas apie tai, kaip įdiegti get_function_name_as_string Python?

523
30 окт. rinkinys e70 30 okt. 2008-10-30 22:38 '08, 10:38 val. 2008-10-30 22:38
@ 9 atsakymai
 my_function.__name__ 

Naudojant __name__ yra pageidaujamas metodas, nes jis taikomas vienodai. Skirtingai nuo func_name , jis taip pat veikia su integruotomis funkcijomis:

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

Be to, dvigubas pabraukimas parodo skaitytojui, kad tai yra specialus atributas. Kaip premija, klasės ir moduliai turi atributą __name__ , todėl prisimenate tik vieną specialų pavadinimą.

668
01 нояб. vartotojo atsakymas28409 01 nov. 2008-11-01 03:07 '08 at 3:07 2008-11-01 03:07

Taip pat galite naudoti

 import sys this_function_name = sys._getframe().f_code.co_name 
217
22 нояб. Atsakyti Albert Vonpupp lapkričio 22 d. 2012-11-22 16:59 '12, 16:59 pm 2012-11-22 16:59
 my_function.func_name 

Yra ir kitų įdomių funkcijų. Įrašykite dir(func_name) . func_name.func_code.co_code yra sukompiliuota funkcija, saugoma kaip eilutė.

 import dis dis.dis(my_function) 

rodys kodą vartotojui suprantamu formatu :) :)

37
30 окт. Markus Jarderot atsakymas spalio 30 d 2008-10-30 22:39 '08 10:39 pm 2008-10-30 22:39

Ši funkcija grąžins skambintojo funkcijos pavadinimą.

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

Tai panaši į Albert Wonppuppa atsakymą su draugišku paketu.

28
21 дек. Atsakymas duotas Demyn gruodžio 21 d. 2013-12-21 03:59 '13, 03:59 2013-12-21 03:59

sys._getframe () gali būti neprieinama visuose „Python“ diegimuose ( žr. ref ), pavyzdžiui, galite naudoti sekimo modulį.

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

Skambinant kaminai [-1], bus grąžintos esamos proceso detalės.

11
31 авг. atsakymą pateikė Sandyc Aug 31 2013-08-31 03:34 '13, 03:34 am 2013-08-31 03:34

Jei jus domina ir klasės metodai, Python 3.3+ turi __qualname__ , be __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" 
10
07 нояб. atsakymas pateiktas lapis 07.11 . 2017-11-07 13:48 '17 at 13:48 2017-11-07 13:48

Man patinka naudoti dekoratoriaus funkciją. Pridėjau klasę, kuri taip pat daugina funkcijų laiką. Tarkime, kad „gLog“ yra standartinis „python“ registruotojas:

 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 

todėl dabar, ką turite daryti su savo funkcija, ją puošia ir voila

 @func_timer_decorator def my_func(): 
9
19 июля '16 в 11:37 2016-07-19 11:37 atsakymas pateikiamas radato liepos 19, 16 d. 11:37 2016-07-19 11:37

Kadangi @Demyn atsakymo plėtinys, aš sukūriau keletą naudingumo funkcijų, kurios spausdina dabartinį funkcijos pavadinimą ir dabartinius funkcijų argumentus:

 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)]) 
8
26 марта '16 в 0:21 2016-03-26 00:21 atsakymą pateikė Jim G. Kovo 26 d., 16 d. 0:21 2016-03-26 00:21

Jūs tiesiog norite gauti funkcijos pavadinimą čia, tai yra paprastas kodas. tarkime, kad apibrėžėte šias funkcijas

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

veikimas1

Tarkime, kad jūs turite šias funkcijas

 a = [function1 , function2 , funciton3] 

gauti funkcijos pavadinimą

 for i in a: print i.__name__ 

produkcija bus

funkcija1
funkcija2
funkcija3

2
16 марта '18 в 17:21 2018-03-16 17:21 Atsakymą pateikė Muhammad Mohsin kovo 18 d. 18 val. 15:21 2018-03-16 17:21

Peržiūrėkite kitus klausimus apie žymes arba užduoti klausimą