Есть ли способ получить в python исходное значение параметров функции заданного фрейма? - PullRequest
0 голосов
/ 30 апреля 2018

Как получить значения параметров вызова функции / метода?

Это для инструмента отладки, и он будет использоваться в сценарии, подобном этому:

import inspect

def getCallParameter():
  stack = inspect.stack()
  outer = stack[1] #This is an example, I have a smarter way of finding the right frame
  frame = outer.frame
  print("") #print at least a dict of the value of the parameters, and at best, give also wich parameter are passed explicitely (e.g. with f(2, 4) an input of this kind : "a=2, b=4, c=5(default)")


def f(a, b=4, c=5):
  a+=b+c
  getCallParameters()
  return a

Примечание. Мне известно о inspect.formatargsvalues(), но оно не соответствует моим требованиям, поскольку в примере f(2,4) было бы напечатано «a = 11, b = 4, c = 5)»

То, о чем я думаю, - это смотреть на внешнем кадре переданные значения. Это не проблема, если я не получу исходное состояние переданного объекта, пока я получаю объекты, изначально привязанные к параметрам переменной. Пример:

# with f(4)

def f(a, b=4, c=[])
  c.append(5)
  getCallParameters() # a=4, b=4, c=[5] is ok even if I would have preferred c=[]
  c = [4]
  getCallParameters() # here, I exepect c=[5] or c=[]

1 Ответ

0 голосов
/ 30 апреля 2018

Я имею в виду другой способ справиться с поиском точных переданных параметров, но мне интересно, совместим ли он с вашим инструментом отладки. Это хорошо заботится о том, как вызывается функция. Тем не менее, реальные параметры кадра должны быть получены с такими вещами, как inspect.

def inspect_decorator(func):            # decorator 
    def wrapper(*args, **kwargs):       # wrapper function
        # TODO: don't print! consume somewhere else
        print('{} is called with args={} kwargs={}'.format(func.__name__, args, kwargs))
        return func(*args, **kwargs)    # actual execution
    return wrapper                      # wrapped function


@inspect_decorator
def f(a, b=4, c=5):
    a += b + c
    return a


f(3)
f(3, 5)
f(3, b=4)
# f is called with args=(3,) kwargs={}
# f is called with args=(3, 5) kwargs={}
# f is called with args=(3,) kwargs={'b': 4}

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

...