Как я могу найти сценарий python для использования метода класса перед запуском? - PullRequest
0 голосов
/ 19 февраля 2020

Я бы хотел иметь возможность сканировать сценарий python на предмет использования метода класса перед запуском самого сценария. Например, с помощью следующего сценария получить все использования метода "foo" для класса "A" и аргументов, переданных методу

class A():
    def foo(self, val):
        return val + 1

class B():
    def foo(self, val):
        return val - 1

a = A()
b = B()

a_val = a.foo(1)
b_val = b.foo(1)

. Это слишком простой пример, но цель здесь использовать что-то большее, чем регулярное выражение для поиска шаблона foo(), чтобы такие элементы, как b.foo(1), не возвращались. Я посмотрел на модули ast и symtable, но, похоже, они не имеют той функциональности, которая мне нужна. Я понимаю, что это может быть трудной / невозможной проблемой из-за того, что python является интерпретируемым языком, но кажется, что кто-то еще должен был иметь эту проблему до

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Это невозможно сделать с помощью анализа кода stati c, поскольку владелец метода определяется во время выполнения. Например, я мог бы добавить к вашему примеру:

b = a
b.foo(0)

Здесь b.foo(0) фактически является вызовом метода класса A '* foo. И анализ кода stati c не может этого знать, потому что это зависит от времени выполнения.

Это означает, что то, что вы запрашиваете, сводится к проблеме остановки. Невозможно сделать то, что вы просите, с гарантированным (или даже вероятностно более точным, чем случайный) правильным ответом.

0 голосов
/ 19 февраля 2020

Это звучит как XY Проблема , но, увы. Вы можете использовать модуль inspect для проверки классов и функций во время выполнения:

import inspect

class Foo:
    def bar(self, val):
        return val + 1

    def baz(self, number):
        return number

functions = inspect.getmembers(Foo(), predicate=inspect.ismethod)

for name, function in functions:
    sig = inspect.signature(function)
    print(f'Function "{name}" has a params {sig}')

Выходы:

Function "bar" has a params (val)
Function "baz" has a params (number)
...