Получение функции, содержащей строку в Python - PullRequest
1 голос
/ 12 января 2012

Я хочу сделать что-то вроде отражения, где, учитывая номер строки и модуль, я получаю обратно имя функции в этом модуле, содержащем эту строку. Возможно ли это в Python?

1 Ответ

2 голосов
/ 12 января 2012

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

import re

def get_function_name(module, line):
    module_file = module.replace('.', '/') + '.py'
    lines = open(module_file, 'r').xreadlines()
    i = line - 1
    try:
        while i:
            tmp = next(lines)
            i -= 1
    except StopIteration:
        raise EOFError('Not enought lines in module %s' % module)
    function_line = next(lines)
    function_name =  re.match('def (\w+)\([^)]*\):', function_line)
    if function_name:
        return function_name.group(1)
    raise ValueError('No function declared on line %s' % line)

Эта функция открывает модуль, переданный в виде файла, выполняет итерацию до достижения пройденной строки, а затем выполняет поиск имени функции с помощью регулярных выражений. Если в переданной строке не было объявлено ни одной функции или если число переданных строк превысило количество строк в файле, будет получено значение Error. E.g.:

>>> get_function_name('my_module.my_submodule', 24)
'my_function_name'
>>> get_function_name('my_module.my_submodule', 25)
    Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 15, in get_function_name
ValueError: No function declared on line 17
>>> get_function_name('my_module.my_submodule', 123456)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 10, in get_function_name
EOFError: Not enought lines in module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...