1

PHP から Python/Django を初めて使用し、この例の update() と get() の例に頭を悩ませようとしています。

https://pypi.python.org/pypi/django-social-auth/0.3.0

update(): enable() である項目のみを対象とした doina jquery っぽいタイプの更新のように見えます...その関数が val からどのように出てくるのか、実際にはわかりません。

            backends.update(((key, val)
                for key, val in sub.BACKENDS.items()
                    if val.enabled()))

そしてget(): なぜ 2 組あるの()()ですか?

BACKENDS.get(name, lambda *args, **kwargs: None)(*args, **kwargs)
4

2 に答える 2

5

このdict.update()関数(key, value)は反復可能なペアを取ることができます。そこにあるコードは、そのようなペアを生成するジェネレーター式を渡します。ループしsub.BACKENDS.items()、ペアごとに、val.enabled()メソッドが を返すペアのみを選択しますTrue。for ループとして表現することもできます。

for key, value in sub.BACKENDS.items():
    if value.enabled():
        backends[key] = value

このdict.get()関数は、キーまたはデフォルトのいずれかを返します。ここで、デフォルトは無名関数 alambdaです。したがって、BACKENDディクショナリには、name変数で指定されたキーの値があるか、ラムダ匿名関数が返されます。いずれにせよ、.get()呼び出しの結果自体が呼び出されます。Python では、関数は第一級のオブジェクトです。辞書にも保存できます。辞書から取得した場合でも、それを呼び出すことができます。

>>> def foo(): print 'bar'
... 
>>> somedict = {'howdy': foo}
>>> somedict['howdy']()
bar
>>> somedict['howdy']
<function foo at 0x109ab9320>
>>> somedict.get('non-existent', 'not found')
'not found'
>>> somedict.get('howdy', 'not found')
<function foo at 0x109ab9320>
>>> somedict.get('howdy', 'not found')()
bar

そのため、返されたものに追加の()after.get()が適用されます。.get()

ラムダは、式で定義できる無名関数def functionname()です (行はステートメントであり、独立している必要があります)。したがって、ラムダは辞書に直接格納しながら定義できます。

>>> somedict = {'howdy': lambda: 'bar'}
>>> print somedict['howdy']()
bar
于 2013-06-05T00:16:50.190 に答える
0

私はあなたの例を書き込もうとしますが、もう少し明確です。@Martijn Pieters の回答の説明を参照してください。

new_items = [(key, func) for key, func in sub.BACKENDS.items() if func.enabled()]
backends.update(new_items)

def do_nothing(*args, **kwargs):
    pass

func = BACKENDS.get(name, do_nothing)
func(*args, **kwargs)
于 2013-06-05T00:23:18.413 に答える