2

少し検索した後、次のコードを使用して web.py で WTForms オブジェクトをインスタンス化できることがわかりました。

form = my_form(**web.input())

web.input() は「辞書のような」 web.storage オブジェクトを返しますが、2 つのアスタリスクがない場合、WTForms は例外を発生させます。

TypeError: formdata should be a multidict-type wrapper that supports the 'getlist' method

Python のドキュメントから、名前付き引数の辞書をアンパックするために 2 つのアスタリスクが使用されていることがわかります。とは言っても、正確に何が起こっているのかについては、まだ少し混乱しています。web.input() によって返される web.storage オブジェクトが、** によってアンパックできるほど辞書のよう」であるのに、WTForms コンストラクターにそのまま渡すことができるほど「辞書のよう」ではないのはなぜですか?

これが非常に基本的な質問であることは承知していますが、初心者のプログラマーに役立つアドバイスをいただければ幸いです。

4

2 に答える 2

3

ドキュメントを参照してください。違いは、doingfunc(someDict)が 1 つの引数、つまり dict を渡すことです。実行すると、 dictfunc(**someDict)がアンパックされ、各キーと値のペアが個別のキーワード引数として渡されます。

違いは、「十分に辞書に似ている」ことや、辞書のような度合いが異なることとは何の関係もありません。(withweb.pyや WTForms とも関係ありません。) 2 つのオプションは、関数が異なる種類の引数を受け入れるように記述できる 2 つの異なる方法であり、それらの引数を渡す 2 つの対応する方法です。例:

>> def oneArg(d):
...     print d
>>> def manyArgs(**d):
...     print d
>>> d = {'a': 1, 'b': 2}
>>> oneArg(d)
{'a': 1, 'b': 2}
>>> manyArgs(**d)
{'a': 1, 'b': 2}
>>> manyArgs(a=1, b=2)
{'a': 1, 'b': 2}

特に最後の 2 つの例は、何が行われるかを示して**dいます。dict を渡すこと**dは、各キー/値のペアを個別のキーワード引数として渡すことと同じです。

于 2012-08-29T07:03:50.893 に答える
1

WTFormsソースから:

def process(self, formdata=None, obj=None, **kwargs):
    if formdata is not None and not hasattr(formdata, 'getlist'):
        if hasattr(formdata, 'getall'):
            formdata = WebobInputWrapper(formdata)
        else:
            raise TypeError("formdata should be a multidict-type wrapper that supports the 'getlist' method")

    for name, field, in iteritems(self._fields):
        if obj is not None and hasattr(obj, name):
            field.process(formdata, getattr(obj, name))
        elif name in kwargs:
            field.process(formdata, kwargs[name])
        else:
            field.process(formdata)

現在、引数をとして渡しますが、作業する**kwargs場合は、どちらにもメソッドがないため、通常の型やwebpy型とは異なるmultidictタイプにする必要があります。同じキーの複数の値を格納するdictです。formdatadictweb.storagegetlistmultidict

あなたはこのように議論web.input()として渡そうとするかもしれません:私はそれがうまくいくはずだと思います。objform = my_form(None, web.input())

于 2012-08-29T09:27:04.480 に答える