есть ли подобный синтаксис для переменной $$ php в python - PullRequest
2 голосов
/ 21 августа 2009

Есть ли подобный синтаксис для переменной $$ php в python? на самом деле я пытаюсь загрузить модель на основе значения.

например, если значение равно Song, я хотел бы импортировать модуль Song. Я знаю, что могу использовать операторы if или lambada, но что-то похожее на переменную $$ php будет очень удобным.

то, что я ищу, похоже на это.

from mypackage.models import [*variable] 

тогда в представлениях

def xyz(request): 
    xz = [*variable].objects.all() 

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

Ответы [ 4 ]

3 голосов
/ 21 августа 2009
def load_module_attr (path):
    modname, attr = path.rsplit ('.', 1)
    mod = __import__ (modname, {}, {}, [attr])
    return getattr (mod, attr)

def my_view (request):
    model_name = "myapp.models.Song" # Get from command line, user, wherever
    model = load_module_attr (model_name)
    print model.objects.all()
1 голос
/ 21 августа 2009

Кажется, что вы хотите загрузить все потенциально подходящие модули / модели под рукой и в соответствии с запросом выбрать конкретный для использования. Вы можете "globals ()", который возвращает словарь переменных глобального уровня, индексируемых строкой. Так что если вы сделаете что-то вроде globals () ['Song'], это даст вам модель Song. Это очень похоже на PHP $, за исключением того, что он будет захватывать только переменные глобальной области видимости. Для локальной области вы должны были бы вызвать местные жители ().

Вот пример кода.

from models import Song, Lyrics, Composers, BlaBla

def xyz(request):
    try:
        modelname = get_model_name_somehow(request):
        model =globals()[modelname]
        model.objects.all()
    except KeyError:
        pass # Model/Module not loaded ... handle it the way you want to 
1 голос
/ 21 августа 2009

Я уверен, что вы хотите __import__().

Читать это: docs.python.org: __import__

Эта функция вызывается оператором import. Его можно заменить (импортировав встроенный модуль и присвоив builtins.__import__), чтобы изменить семантику оператора импорта, но в настоящее время обычно проще использовать ловушки импорта (см. PEP 302). Прямое использование __import__() встречается редко, за исключением случаев, когда вы хотите импортировать модуль, имя которого известно только во время выполнения.

0 голосов
/ 21 августа 2009

Итак, вы знаете общую концепцию, то, что вы пытаетесь реализовать, называется «рефлексивное программирование».

Вы можете увидеть примеры на нескольких языках в википедии здесь

http://en.wikipedia.org/wiki/Reflective_programming

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