これは不可能です。これは、後でパフォーマンスを最適化できるようにするためだと思います。Python バイトコードはローカルを名前ではなくインデックスで参照します。locals() が書き込み可能である必要がある場合、インタープリターがいくつかの最適化を実装するのを妨げたり、それらをより困難にしたりする可能性があります。
このようなローカルを編集できることを保証するコア API を見つけることはできないと確信しています。なぜなら、その API がそれを行うことができれば、 locals() にもこの制限がないからです。
コンパイル時にすべてのローカルが存在する必要があることを忘れないでください。コンパイル時にローカルにバインドされていない名前を参照すると、コンパイラはそれがグローバルであると見なします。コンパイル後にローカルを「作成」することはできません。
考えられる解決策の 1 つについては、この質問を参照してください。
サンプル コードには基本的な問題があることに注意してください。
@depends("a", "b", "c", "d", "e", "f")
def test():
put_into_locals(test.dependencies)
"test.dependencies"fが現在の関数である「f.dependencies」を参照していません。実際のグローバル値「test」を参照しています。つまり、複数のデコレータを使用する場合:
@memoize
@depends("a", "b", "c", "d", "e", "f")
def test():
put_into_locals(test.dependencies)
「test」は memoize のラップされた関数であり、依存する関数ではないため、機能しなくなります。Pythonには、「現在実行中の関数」(およびクラス) を参照する方法が本当に必要です。