Самоанализ функции Python: какие члены класса, переданного в качестве аргумента, упоминаются внутри него? - PullRequest
0 голосов
/ 02 мая 2018

Скажите, что у меня есть такая функция:

def eggs(a,b,c):
    if c.foo:
        return a + b.bar
    else:
        return c.spam

Я хотел бы иметь функцию более высокого порядка, способную анализировать переданную функцию и извлекать, какие члены аргумента упоминаются в коде через синтаксис точки, со следующим поведением:

>>> member_inspector(eggs, 'c')
('foo','spam')

>>> member_inspector(eggs, 'b')
('bar')

>>> member_inspector(eggs, 'a')
()

Можно ли это сделать? Как?

1 Ответ

0 голосов
/ 02 мая 2018

Вот базовая версия:

import inspect
from textwrap import dedent
import ast

def member_inspector(f, var):
    source = dedent(inspect.getsource(f))
    module = ast.parse(source)
    func = module.body[0]
    result = []
    for stmt in func.body:
        for node in ast.walk(stmt):
            if (isinstance(node, ast.Attribute) and
                    isinstance(node.value, ast.Name) and
                    node.value.id == var):
                result.append(node.attr)
    return result
...