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