2013-05-11 2 views
0

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

Просто хочу отметить, что я могу просто использовать mylist.append (что угодно), но я специально ищу способ автоматического добавления, а не вручную.

Таким образом, если мы начнем с ...

def function1(*args): 
    print "string" 

def function2(*args): 
    print "string 2" 

mylist = [] 

... есть способ, чтобы добавить «function1» и «function2» автоматически MyList так, что она будет в конечном итоге, как это .. .

mylist = [function1, function2] 

в частности, я хотел бы иметь имя переменной в списке, а не строка (например, «function1»).

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

Заранее благодарим за любые предложения и счастливые ответы на любые вопросы, если я не был ясен.

**

ответ

1

Просто добавьте объект функции в списке:

mylist = [function1, function2] 

или использовать .append():

mylist.append(function1) 
mylist.append(function2) 

функции Python являются объектами первого класса. Это значения, как классы, строки и целые числа.

Если вы хотите автоматизировать этот процесс для всего модуля, вы можете использовать globals() function быстро перечислить все функции, определенные в модуле до сих пор, с небольшой помощью от inspect.isfunction() predicate:

import inspect 
mylist = [v for v globals().itervalues() if inspect.isfunction(v) and v.__module__ == __name__] 

Испытание v.__module__ == __name__ гарантирует, что мы будем перечислять только функции из текущего модуля, а не все, что мы импортировали.

Однако явное все же лучше, чем неявное. Либо добавить mylist.append(functionname) ниже каждую функцию, или использовать декоратор:

mylist = [] 
def listed(func): 
    mylist.append(func) 
    return func 

@listed 
def function1(): 
    pass 

@listed 
def function2(): 
    pass 

Каждой функцию, которую вы отмечает 'с @listed декоратором добавляются в mylist список.

+0

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

+0

@ user2061277 Явный лучше, чем неявный. Как бы он даже определил, что включить в этот список, а что нет? – delnan

+0

@ user2061277: Это неясно из вашего вопроса. Существует множество вариантов; используя «декораторы» («маркировка» всех функций, которые вы хотите добавить в список, с небольшим дополнительным синтаксисом), перечисление всех объектов в пространстве имен 'globals()', затем фильтрация по функциям и т. д. –

0

В принципе, вы можете сделать это с декоратором, который, вероятно, квалифицируется в качестве полуавтоматического решения:

@gather 
def function1(): 
    print "function 1" 

@gather 
def function2(): 
    print "function 2" 

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

function_list = [] 

def gather(func): 
    function_list.append(func) # or .append(func.__name__) 
    return func 

В этом простом воплощении это, вероятно, не полезно вообще, но популярные библиотеки и фреймворки часто используют несколько улучшенную версию этого метода.В качестве примера см. Декоратор Flask @app.route для указания функций, которые обрабатывают определенные HTTP-запросы.

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