tipos separar reemplazar por funcion contar comparar caracteres caracter cadenas python string function

separar - string en python



¿Cómo obtener un nombre de función como una cadena en Python? (9)

Como una extensión de la respuesta de @Demyn , creé algunas funciones de utilidad que imprimen el nombre de la función actual y los argumentos de la función actual:

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

En Python, ¿cómo obtengo un nombre de función como una cadena sin llamar a la función?

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

debe salir "my_function" .

¿Está disponible en python? Si no, ¿ get_function_name_as_string alguna idea de cómo escribir get_function_name_as_string en Python?


Esta función devolverá el nombre de la función de la persona que llama.

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

Es como la respuesta de Albert Vonpupp con un envoltorio amigable.


Me gusta usar un decorador de funciones. Agregué una clase, que también mide el tiempo de la función. Supongamos que gLog es un registrador de Python estándar:

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

Así que ahora todo lo que tienes que hacer con tu función es decorarlo y listo.

@func_timer_decorator def my_func():


No se garantiza que sys._getframe () esté disponible en todas las implementaciones de Python ( ver ref ), puede usar el módulo de rastreo para hacer lo mismo, por ejemplo.

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

Una llamada a la pila [-1] devolverá los detalles del proceso actual.


Si también te interesan los métodos de clase, Python 3.3+ tiene __qualname__ además 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"


Solo desea obtener el nombre de la función aquí es un código simple para eso. Digamos que tienes estas funciones definidas

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

la salida será function1

Ahora digamos que tiene estas funciones en una lista

a = [function1 , function2 , funciton3]

para obtener el nombre de las funciones

for i in a: print i.__name__

la salida será

función1
función2
función 3


También podrías usar

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


my_function.__name__

Usar __name__ es el método preferido ya que se aplica uniformemente. A diferencia de func_name , también funciona en funciones incorporadas:

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

También los guiones bajos indican al lector que este es un atributo especial. Como beneficio adicional, las clases y los módulos también tienen un atributo __name__ , por lo que solo tiene que recordar un nombre especial.


my_function.func_name

También hay otras propiedades divertidas de las funciones. Escriba dir(func_name) para dir(func_name) . func_name.func_code.co_code es la función compilada, almacenada como una cadena.

import dis dis.dis(my_function)

mostrará el código en un formato legible casi por humanos. :)