Как получить текущий объект функции в Python?

#python

#python

Вопрос:

Есть ли способ получить текущую функцию, в которой я нахожусь?

Я ищу фактический объект функции, а не имя функции.

     def foo(x,y):
        foo_again = <GET_CURRENT_FUNCTION>
        if foo_again == foo:
            print ("YES they are equal!")
  

Я предполагаю, что мог бы сделать это в модуле проверки Python, но, похоже, я не могу его найти.

ОТРЕДАКТИРУЙТЕ причину, по которой я хочу, чтобы я хотел распечатать аргументы моей функции. И я могу сделать это с помощью inspect. Вот так

    def func(x,y):
       for a in inspect.getfullargspec(func).args:
           print (a, locals()[a])
  

Это работает, но я не хочу вручную вводить имя функции. Вместо этого я хочу сделать

    def func(x,y):
       for a in inspect.getfullargspec(<GET_CURRENT_FUNCTION>).args:
           print (a, locals()[a])
  

Комментарии:

1. я обновил вопрос

2. Что такого плохого в написании имени функции?

3. я планирую скопировать и вставить эти 2 строки кода во все функции, для которых я хочу видеть аргументы. поэтому я не хочу менять имя функции каждый раз, когда мне нужно это сделать.

4. Разве тогда декоратор не был бы лучше? И увидеть xyproblem.info

Ответ №1:

из inspect.stack вы можете получить имя функции.

Вот обходной путь, который может быть не оптимальным, но он дает ожидаемые результаты.

 def foo(x,y): 
    this_function = inspect.stack()[0].function 
    for a in inspect.getfullargspec( eval(this_function) ).args: 
        print(a, locals()[a]) 
    print(this_function)
  

Затем

 foo('a','b')
>>>
    x a
    y b
    foo
  

Ответ №2:

Один из способов добиться этого — использовать декоратор. Вот пример:

 def passFunction(func):
    @functools.wraps(func)
    def new_func(*args, **kwargs):
        return func(func,*args, **kwarsgs)
    return new_func

@passFunction
def foo(f, x, y):
    ...

foo(x,y)