Прежде всего, звучит так, как будто вы немного изобретаете колесо ... большинство веб-фреймворков Python (CherryPy / TurboGears - это то, что я знаю) уже включают способ отправки запросов в определенные классы на основе содержимого URL или пользовательский ввод.
Нет ничего неправильного в том, как вы это делаете, на самом деле, но по моему опыту это имеет тенденцию указывать на своего рода "недостающую абстракцию" в вашей программе. В основном вы полагаетесь на интерпретатор Python, который хранит список объектов, которые могут вам понадобиться, а не храните его самостоятельно.
Итак, в качестве первого шага вы можете просто составить словарь для всех классов, которые вы хотите вызвать:
dispatch = {'Foo': Foo, 'Bar': Bar, 'Bizbaz': Bizbaz}
Первоначально, это не будет иметь большого значения. Но по мере роста вашего веб-приложения вы можете найти несколько преимуществ: (а) вы не столкнетесь с конфликтами в пространстве имен, (б) при использовании globals()
у вас могут возникнуть проблемы с безопасностью, когда злоумышленник, по сути, может получить доступ к любому глобальному символу в вашей программе, если они могут найти способ вставить произвольный classname
в вашу программу, (c) если вы когда-нибудь захотите, чтобы classname
отличался от реального точного имени класса, использование вашего собственного словаря будет более гибким, ( d) вы можете заменить словарь dispatch
более гибким пользовательским классом, который осуществляет доступ к базе данных, или что-то в этом роде, если вы обнаружите необходимость.
Проблемы безопасности особенно заметны для веб-приложения. Выполнение globals()[variable]
, где variable
является вводом из веб-формы, просто , требующий неприятностей .