Официальная документация для проверки модели гласит следующее:
Проверка модели происходит до выполнения действия контроллера.
blockquote>Поэтому вам необходимо очистить
ModelState
и вручную запустить проверку, используя код снизу.if (!model.DifferentShippingAddress) { model.ShippingAddress = model.BillingAddress.ToShipping(); ModelState.Clear(); TryValidateModel(model); }
В примере строка выполняется как код с помощью исполнительной функции.
import sys
import StringIO
# create file-like string to capture output
codeOut = StringIO.StringIO()
codeErr = StringIO.StringIO()
code = """
def f(x):
x = x + 1
return x
print 'This is my output.'
"""
# capture output and errors
sys.stdout = codeOut
sys.stderr = codeErr
exec code
# restore stdout and stderr
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
print f(4)
s = codeErr.getvalue()
print "error:\n%s\n" % s
s = codeOut.getvalue()
print "output:\n%s" % s
codeOut.close()
codeErr.close()
Для операторов использовать exec(string)
(Python 2/3) или exec string
(Python 2):
>>> mycode = 'print "hello world"'
>>> exec(mycode)
Hello world
При необходимости в значении выражения использовать eval(string)
:
>>> x = eval("2+2")
>>> x
4
Однако первый шаг должен быть должен спросить себя, если Вы действительно должны. Выполнение кода должно обычно быть положением последней инстанции: это медленно, ужасно и опасно, если это может содержать вводимый пользователями код. Необходимо всегда смотреть на альтернативы сначала, такие как высший порядок функционирует, чтобы видеть, могут ли они лучше удовлетворить потребности.
Наиболее логичное решение должно было бы использовать встроенную оценку (), функция.Another решение состоит в том, чтобы записать, что строка во временный файл Python и выполняет его.