0

パラメータを処理する関数がいくつかあります。たとえば、次のようになります。

def createDataModel(objectModel):
    ......
def createLayoutModel(objectModel):
    ......
def createWidgetModel(objectModel):
    ......

(dataModel、layout、page)のような特定のルートタグ名を持ついくつかのxmlを入力ファイルとして持っており、それらをオブジェクトモデルに変換します。オブジェクトモデルを処理する関数を決定するマップがあります

xsdPathsMap = {
    "dataModel": createDataModelFromXml,
    "layout": createLayoutModel,
    "page": createWidgetModelFromXml
}

次に、xmlからオブジェクトモデルを作成し、それらを処理する関数を割り当てます。

result = xsdPathsMap[xmlRootName]
# a is objectified xml
a.modelerFunction = result

オブジェクトをクロージャーメソッドに渡したいときに、次の例外が発生しました。

a.modelerFunction(a)

TypeError: object is not callable    

何が問題ですか?

これが私のトレースバックです:

Traceback (most recent call last):
  File "model/xmlTranporter.py", line 204, in <module>
    a = main("main/schema")
  File "model/xmlTranporter.py", line 200, in main
    a(obj)
TypeError: 'lxml.objectify.StringElement' object is not callable
4

2 に答える 2

2

表示されるエラーメッセージは、でa.modelerFunction(a)、関数があると思いますが、関数がないことを意味します。 a.modelerFunction関数ではなく、ユーザー定義のオブジェクトです。あなたがあなたのコードをもっと投稿すれば、私たちはその理由を理解することができます。

于 2012-07-21T11:45:22.183 に答える
2

なぜこの割り当てをしているのかわかりません:

result = xsdPathsMap[xmlRootName]
a.modelerFunction = result # this is just kind of weird

モデラー関数をのクラスに追加し、aそれをメソッドとして呼び出すだけです。

a.createModel()

または、モデリング関数にを渡すだけです。

result(a)

ただし、これは、マップから取得するモデリング関数が実際には関数であり、クラスではないことを前提としています。

呼び出し可能なクラスを定義したい場合はもちろん問題ありませんが、 __call__プロトコルメソッドを定義する必要があります。

class MyModelingFunction(object):
    ...

    def __call__(self, *args, **kwargs):
        """do something when I'm called"""
于 2012-07-21T12:01:13.147 に答える