Я хотел бы сохранить точную строку, которая была набрана для вызова функции, из самой функции с помощью самоанализа (я не могу / не хочу взламывать интерпретатор командной строки - например, получение истории из readline или что не то, что я ищу).
Допустим, если пользователь набрал:
>>> myfunc('a', 'b', 1, mykwarg='hello')
Я хотел бы получить строку вызова (т.е. myfunc('a', 'b', 1, mykwarg='hello')
)
из кода внутри myfunc
.
Я могу создать что-то вроде этого:
def myfunc(a,b,c,mykwarg=None):
frame = inspect.currentframe()
sig = inspect.signature(myfunc)
args = []
for param in sig.parameters.values():
if param.name in frame.f_locals:
args.append(f"{param.name}={str(frame.f_locals[param.name])}")
cmd = f"{frame.f_code.co_name}({','.join(args)})"
print(cmd)
Я получаю:
>>> myfunc('a', 'b', 1, mykwarg='hello')
myfunc(a=a,b=b,c=1,mykwarg=hello)
Что не совсем то, что набрал пользователь. Кроме того, я надеюсь, что есть что-то еще
надежный и менее "хакерский", чтобы попробовать ...
Вариант использования : я хочу иметь возможность связать командный вызов из моей библиотеки с его результатом. Я не хочу жестко программировать хранилище вызовов команд для каждой функции, я бы предпочел использовать декоратор или что-то в этом роде. Вероятно, это гораздо проще сделать из REPL, но я бы не хотел зависеть от этого (например, если пользователь вызывает функцию из своей собственной программы, он все равно должен иметь возможность связать вызов команды с результатом).