2

環境 (nuke と呼ばれるグラフィック プログラム) から、メニュー項目を追加して関数に接続できるグローバル オブジェクトが与えられます。このグローバル オブジェクトは次のように機能します。

menu.addCommand("Do This!", lambda: DoThings())

Python モジュールを動的に読み取り、モジュール関数をグローバル メニュー オブジェクトの項目として追加したいと考えています。そのためのクラスを書きました。私のクラスの簡略版:

class mymenu():
.
.
.
def _builMenuFromPath(self, basepath, module):

    items = []

    # ...
    # there is code to build the items list. this is a list of the python filenames
    # ...

    if len(items) > 0:

        for item in items:

            try:
                f = getattr(__import__(module + "." + item), item) # item is the python filename of an module in the folder with the python files and module is the folder

                menu.addCommand(item, lambda: f.call()) # f.call() is a function in the dynamic loaded python file

            except Exception, e:
                pass

動的インポートは非​​常にうまく機能します。ただし、生成されたすべてのメニュー項目は、最後にインポートされた関数にリンクされています。すべてのメニューアイテムが同じことをするように。

私はプロのプログラマーではありません。だから私は単純な間違いをしていると思います。

ご協力いただきありがとうございます。

4

2 に答える 2

0

lambda: f.call()式の問題は、囲んでいるスコープ内fの変数を参照する自由な用語です。fこれは、 の値の変化がfラムダ内で明らかであることを意味します。例えば:

>>> n = 1
>>> lambda: n
<function <lambda> at 0x00000000027F0898>
>>> l = lambda: n
>>> l()
1
>>> n = 2
>>> l()
2

ただし、lambdaPython の関数とメソッドはオブジェクトであり、(ラムダなどの) callable を渡すことができる場所ならどこにでも渡すことができるため、これは不要です。このコードでは:

menu.addCommand(item, f.call)

f.call呼び出し可能なバインドされたメソッドに評価される式です。

于 2012-07-10T20:45:58.580 に答える
0

lambda:f.call() の代わりに f.call を渡してみてください。

于 2012-07-10T20:32:38.697 に答える