Это невозможно. Я думаю, что это позволит оптимизировать производительность позже. Байт-код Python ссылается на локальных по индексу, а не по имени; если locals () требуется для записи, это может помешать интерпретаторам реализовать некоторые оптимизации или усложнить их.
Я совершенно уверен, что вы не найдете никакого основного API, который бы гарантировал, что вы можете редактировать локальные данные, как это, потому что если бы этот API мог это сделать, у locals () тоже не было бы этого ограничения.
Не забывайте, что все местные жители должны существовать во время компиляции; если вы ссылаетесь на имя, которое не привязано к локальному во время компиляции, компилятор предполагает, что оно глобальное. Вы не можете «создавать» местных жителей после компиляции.
См. этот вопрос для одного возможного решения, но это серьезный взлом, и вы действительно не хотите этого делать.
Обратите внимание, что в вашем примере кода есть основная проблема:
@depends("a", "b", "c", "d", "e", "f")
def test():
put_into_locals(test.dependencies)
"test.dependencies"
не относится к "f.dependencies", где f - текущая функция; это ссылка на фактическое глобальное значение «тест». Это означает, что если вы используете более одного декоратора:
@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
put_into_locals(test.dependencies)
больше не будет работать, так как «test» - это функция обертывания memoize, а не зависит от нее Python действительно нуждается в способе ссылки на "выполняемую в данный момент функцию" (и класс).