Как я могу заставить Python интерпретировать строку как код Python? - PullRequest
1 голос
/ 18 января 2012

Я написал функцию в Django для поиска объекта по типу, который работает следующим образом:

def lookup(modelType, item_id):
    try:
        return eval(modelType).objects.get(pk=item_id)
    except ObjectDoesNotExist:
        return None

lookup(Course, 14) должен вернуть Course.objects.get(pk=14), если есть объект курса с идентификатором 14.

Можно ли написать эту функцию? Спасибо.

Ответы [ 2 ]

4 голосов
/ 18 января 2012

Если вы хотите использовать lookup(Course, 14), сделайте это.

def lookup( the_model, item_id ):
    try:
        the_model.objects.get( pk=item_id )
    except the_model.DoesNotExist:
        return None

Если вы хотите продолжать использовать написанную вами функцию, вы должны передать модель в виде строки.

lookup( "Course", 14)

Также. return None очень плохая идея. Как правило, гораздо лучше правильно использовать исключения.

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

Eval (или exec) слишком опасен для такого использования. Вам лучше создать отображение между моделями и строкой. Например:

from school.models import Student, Teacher

model_mapping = {'student': Student,
                 'teacher': Teacher}

Если задана строка, вы можете сделать:

string_of_a_model = 'student'
model_mapping[string_of_a_model].objects.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...