2016-11-08 2 views
0

У меня есть класс Python с несколькими различными методами, выполняющими разные вещи, но я бы хотел, чтобы каждый из них, когда он запускался, сохранял его значения имени и аргумента, чтобы я мог используйте их позже. Один из способов я нашел, чтобы добавить что-то вроде этого, чтобы каждый из них:Как сохранить метаданные метода класса в Python

frame = inspect.currentframe() 
args, _, _, values = inspect.getargvalues(frame) 
function_name = inspect.getframeinfo(frame)[2] 
function_meta = {arg: values[arg] for arg in args} 
self.meta[function_name] = function_meta 

Это хорошо, однако, я бы предпочел, чтобы держать его DRY и не должны копировать/вставить этот фрагмент, идентичный к каждый способ добавляю.

С другой стороны, я мог бы превратить его в отдельную функцию save_meta(), но затем inspect будет возвращать данные из save_meta(), вместо функции вызвавшей его, не так ли? Есть ли элегантный и многоразовый способ решения этого?

ответ

1

Вы только, кажется, зависят от текущего кадра для inspect. Я хотел бы предложить

def save_meta(frame): 
    args, _, _, values = inspect.getargvalues(frame) 
    function_name = inspect.getframeinfo(frame)[2] 
    function_meta = {arg: values[arg] for arg in args} 
    self.meta[function_name] = function_meta 

И называть его

save_meta(inspect.currentframe()) 
+0

Ах проклятый, ты прав, это был довольно простой. :) Благодаря! Бонусный вопрос: есть ли более простой способ сделать это? – machaerus

+0

@machaerus Извините, я видел ваш вопрос только сейчас. Что вы имеете в виду с облегчением? – pingul

+0

Я подумал, что, возможно, есть способ сделать это без написания пользовательской функции. Похоже, это довольно простая функциональность, я удивлен, что для этого нет встроенного метода. – machaerus

Смежные вопросы