2016-01-26 4 views
1

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

#!/usr/bin/env python 

# some code here 

DISPACHERS = { 
    "run": func_run 
    "list": func_list 
} 

# other code 

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

Я мог бы использовать строки для хранения функции и получить ее с помощью чего-то вроде getattr(__main__, "func_run"), поэтому я могу придерживаться своих предпочтений, но я думаю, что это «правильный» способ.

Любая идея?

=== Обновление ===

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

+0

Не могли бы вы поместить их в другой модуль, а затем импортировать их в верхней части вашего скрипта? Почему он не может подняться наверху в текущем состоянии? – Holloway

+0

@ Холлоуэй Я так не думаю, так как он все еще пропускает объявление функции. По той же причине я не могу поставить ее наверху, поскольку после нее объявляются фактические функции обработчика, или я буду иметь эту ошибку: 'NameError: name 'func_run' не определен' – Lin

+0

Поместите его после объявлений функций и не сделайте сделайте проблему. – furas

ответ

2

Используйте декоратор для перечисления функций.

dispatchmap = {} 

def dispatcher(name): 
    def add_dispatcher(func): 
    dispatchmap[name] = func 
    return func 
    return add_dispatcher 

... 

@dispatcher('run') 
def func_run(...): 
    ... 
+0

Спасибо, никогда не думай об использовании декоратора раньше. Очень конструктивный. – Lin

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