Есть ли в Python способ запуска кода с параметрами из строковой переменной?
Я разрабатываю сайт с взаимодействующими алгоритмами. Проблема в том, что я получаю код в виде строки из базы данных, а мне нужно выполнить его с параметрами, которые пришли из пользовательского интерфейса. Есть ли какая-нибудь библиотека Python, которая может решить эту проблему?
Я новичок в Python и Django и не очень понимаю, возможно ли это или нет.
Пример кода:
class CombinationColex:
def __init__(self, n, k):
self.total_elements = n
self.combination_size = k
self.combination_array = [0] * (self.combination_size + 1)
self.combination_array[self.combination_size] = self.total_elements + 2
self.first()
def first(self):
for i in range(self.combination_size):
self.combination_array[i] = i
def next(self):
if self.combination_array[0] == self.total_elements - self.combination_size:
self.first()
return self.combination_size
j = 0
while self.combination_array[j + 1] - self.combination_array[j] == 1:
self.combination_array[j] = j
j += 1
self.combination_array[j] += 1
return j
def data(self):
return self.combination_array[:-1]
def Start(self):
while True:
for i in range(self.total_elements):
present = i in self.data()
print("1" if present else "0", end="")
print()
if self.next() == self.combination_size:
break
combination_generator = CombinationColex(n, k)
combination_generator.Start()
Да, вы можете реализовать эту функциональность в Python с помощью функции exec()
, но вам следует быть осторожными, так как выполнение произвольного кода из базы данных может представлять угрозу безопасности при неправильном подходе.
В зависимости от того, какой код вы хотите выполнить, ответы могут быть разными, но общая идея состоит в том, чтобы запускать предоставленный пользователем код в среде песочницы, чтобы избежать проблем с безопасностью при использовании недоверенных входных данных.
Некоторые идеи можно найти в этом предыдущем вопросе: Как сделать песочницу Python в чистом Python? и здесь: https://softwareengineering.stackexchange.com/questions/191623/best-practices-for-execution-of-untrusted-code
И в официальной вики здесь: https://wiki.python.org/moin/SandboxedPython
Например, PyPy предлагает песочницу напрямую: https://doc.pypy.org/en/latest/sandbox.html
Другая идея заключается в том, чтобы напрямую запускать код, предоставленный в браузере, с помощью CPython, скомпилированного в WebAssembly (пример здесь: https://testdriven.io/blog/python-webassembly/).