No Python, como obtenho um nome de função como uma string, sem chamar a função?
def my_function():
pass
print get_function_name_as_string(my_function) # my_function is not in quotes
deve produzir "my_function"
.
Essa função está disponível no Python? Se não, alguma idéia de como implementar get_function_name_as_string
, em Python?
Respostas:
Usar
__name__
é o método preferido, pois se aplica de maneira uniforme. Ao contráriofunc_name
, ele funciona também em funções internas:Além disso, os sublinhados duplos indicam ao leitor que este é um atributo especial. Como bônus, as classes e os módulos também têm um
__name__
atributo; portanto, você só lembra de um nome especial.fonte
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. Você tem outra escolha, que é:def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Então, a resposta de Albert Vonpupp parece melhor para mim.f.__name__ == 'f'
.Para obter o nome da função ou método atual de dentro, considere:
sys._getframe
também funciona em vez de,inspect.currentframe
embora o último evite acessar uma função privada.Para obter o nome da função de chamada, considere
f_back
como eminspect.currentframe().f_back.f_code.co_name
.Se também estiver usando
mypy
, pode reclamar que:Para suprimir o erro acima, considere:
fonte
sys._getframe
- ele está diretamente conectado às partes internas do CPython.sys._getframe(1).f_code.co_name
, para poder definir uma função comoget_func_name()
e esperar obter o nome desejado da função que chamou.Existem também outras propriedades divertidas das funções. Digite
dir(func_name)
para listá-los.func_name.func_code.co_code
é a função compilada, armazenada como uma string.exibirá o código em formato legível quase humano. :)
fonte
__names__
são particulares,__names
são especiais._names
privado (sublinhado único antes, apenas uma convenção),__names__
são especiais (sublinhado duplo antes e depois). Não tenho certeza se o duplo sublinhado antes tem algum significado, formal ou como uma convenção.func_name
não existe mais no python3 então você precisa usarfunc.__name__
se você quiser compatibilidadeEsta função retornará o nome da função do chamador.
É como a resposta de Albert Vonpupp com uma embalagem amigável.
fonte
Se você estiver interessado em métodos de classe também, Python 3.3+ tem
__qualname__
além__name__
.fonte
Eu gosto de usar um decorador de funções. Eu adicionei uma classe, que também calcula o tempo da função. Suponha que o gLog seja um logger python padrão:
então agora tudo o que você tem a ver com a sua função é decorá-la e pronto
fonte
Onde
stack () [0] o chamador
stack () [3] o nome da string do método
fonte
stack()[0]
sempre será o chamador,[3]
o nome da string do método.Como uma extensão da resposta de @ Demyn , criei algumas funções utilitárias que imprimem o nome da função atual e os argumentos da função atual:
fonte
sys._getframe()
não está garantido que esteja disponível em todas as implementações do Python ( consulte ref ), você pode usar otraceback
módulo para fazer a mesma coisa, por exemplo.Uma chamada para
stack[-1]
retornará os detalhes do processo atual.fonte
sys._getframe()
for definido,traceback.extract_stack
também será inoperante. O último fornece um superconjunto aproximado da funcionalidade do primeiro; você não pode esperar ver um sem o outro. E, de fato, no IronPython 2.7extract_stack()
sempre retorna[]
. -1Você só quer obter o nome da função aqui é um código simples para isso. digamos que você tenha essas funções definidas
a saída será function1
Agora, digamos que você tenha essas funções em uma lista
para obter o nome das funções
a saída será
função1
função2
função3
fonte
Eu já vi algumas respostas que utilizavam decoradores, embora eu achasse que algumas eram um pouco detalhadas. Aqui está algo que eu uso para registrar nomes de funções, bem como seus respectivos valores de entrada e saída. Eu a adaptei aqui para apenas imprimir as informações em vez de criar um arquivo de log e as adaptei para aplicar ao exemplo específico do OP.
Resultado:
fonte
debug
função, uma vez que você pode adicionar a funcionalidade, simplesmente adicionando o decorador a qualquer função que você precise ou deseje imprimir o nome da função. Parece ser o mais fácil e o mais adaptável.