Получить список имен всех функций в модуле Python в порядке их появления в файле? - PullRequest
1 голос
/ 24 января 2012

Функция globals возвращает словарь, который содержит функции в модуле, а функция dir возвращает список, который содержит имена функций в модуле, но они расположены в алфавитном порядке или в словаре..

Есть ли способ получить имена всех функций в модуле в порядке их появления в файле?

Ответы [ 2 ]

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

Вот мое решение. Считайте исходный файл как строку, отфильтруйте строки, начинающиеся с def, удалите начальные пробелы и извлеките подстроку между первым пробелом и первым левым пареном.

def extract_fns(filename):
    with open(filename) as f:
        lines = f.readlines()
        return [line.split(' ', 1)[1].split('(')[0] for line in lines
            if line.strip().startswith('def')]
0 голосов
/ 24 января 2012

Когда у меня возникла такая необходимость, я использовал декоратор.

def remember_order(func, counter=[0]):
    func._order = counter[0]
    counter[0] += 1
    return func

@remember_order
def foo():
    print "foo"

@remember_order
def bar():
    print "bar"

@remember_order
def baz():
    print "baz"

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

Теперь вы хотите получить все декорированные функции в порядке, в котором они были определены?

import sys
module = sys.modules[__name__]   # get reference to current module
# you could also use a reference to some other module where the functions are

# get the functions in the order defined
funcs = sorted((func for func in
              (getattr(module, name) for name in dir(module))
              if callable(func) and hasattr(func, "_order")),
              key = lambda func: func._order)

# call them in that order
for func in funcs:
    func()

Но было бы проще дать им имена в алфавитном порядке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...