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