6

Objective-Cでは、NSDictionaryOfVariableBindingsマクロを使用して次のような辞書を作成できます

NSString *foo = @"bar"
NSString *flip = @"rar"
NSDictionary *d = NSDictionaryOfVariableBindings(foo, flip)
// d -> { 'foo' => 'bar', 'flip' => 'rar' }

Pythonに似たようなものはありますか?私はよくこのようなコードを書いていることに気づきます

d = {'foo': foo, 'flip': flip}
# or
d = dict(foo=foo, flip=flip)

このようなことをするためのショートカットはありますか?

d = dict(foo, flip) # -> {'foo': 'bar', 'flip': 'rar'}
4

3 に答える 3

4

いいえ、Python のこのショートカットは存在しません。

しかし、おそらくこれはあなたが必要とするものです:

>>> def test():
...     x = 42
...     y = 43
...     return locals()
>>> test()
{'y': 43, 'x': 42}

globals()また、pythonはvars()そのようなことのための関数を提供し、組み込みます。ドキュメントを参照してください。

于 2012-10-08T06:34:04.867 に答える
3

やってみましたvars()

vars([object])モジュール、クラス、インスタンス、または属性を持つその他のオブジェクト
の属性を返します。__dict____dict__

モジュールやインスタンスなどのオブジェクトには、更新可能な__dict__ 属性があります。ただし、他のオブジェクトでは属性に書き込み制限がある場合があり __dict__ます (たとえば、新しいスタイルのクラスは dictproxy を使用して辞書の直接更新を防ぎます)。

それで

variables = vars()
dictionary_of_bindings = {x:variables[x] for x in ("foo", "flip")}
于 2012-10-08T06:36:35.343 に答える
3

Python にはこれを行う方法がありませんが、ローカルまたはグローバルの名前空間全体にアクセスできる機能がlocalsあります。ただし、選択した変数を選択したい場合は、 を使用する方がよいと思います。これを行う関数は次のとおりです。globalsinspect

def compact(*names):
    caller = inspect.stack()[1][0] # caller of compact()
    vars = {}
    for n in names:
        if n in caller.f_locals:
            vars[n] = caller.f_locals[n]
        elif n in caller.f_globals:
            vars[n] = caller.f_globals[n]
    return vars

使用している Python 環境で動作することを確認してください。使用法は次のようになります。

a = 1
b = 2
def func():
    c = 3
    d = 4
    compact('b', 'd')  # returns {'b': 2, 'd': 4}

ただし、変数名を引用符なしで回避する方法はないと思います。

于 2012-10-08T06:37:05.717 に答える