2009-08-14 11 views
4

はのは、私がこれを持っているとしましょう:私はa機能から直接size変数にアクセスするために行うためにローカルに渡し、別の関数から直接変数にアクセスするにはどうすればよいですか?


def a(dict): 
    locals().update(dict) 
    print size 

def b(): 
    size = 20 
    f(locals()) 

は何がありますか?私は知っている:


size = dict["size"] 

しかし、私はより直接的な方法があると思います。私はlocals().update(dict)を使ってみましたが、うまくいきませんでした。より良い方法がありますか?

+2

あなたは実際にやろうとしていますか? – SilentGhost

+0

'locals [" size "]'ではなく、変数に直接アクセスしたいのですが、 – Geo

+4

あなたの大きな写真は何ですか?おそらくもっと良い方法があります。 – sykora

答えて

12

Pythonコンパイラは、コンパイル時に、関数がアクセスしているベアラームがローカルかどうかを認識することで、ローカル変数へのアクセスを最適化します。だから、コード場合: - しません含まれているものは何でもd

def lv1(d): 
    locals().update(d) 
    print zap 

コンパイラはそのbarename zapが(機能lv1に割り当てられていない)ローカルではなく、そうではなくグローバルとしてそれにアクセスするためのコードをコンパイルし、「知っています」問題。あなたが遅くて肥大化したコードを好む場合

、あなたは関数内でexecを使用して最適化を倒すことができます - コンパイラがキーワードexecを見たとき、それはあなたがあなたのコードがなど、遅い肥大化やバギーにしようとしているKNOWSできるだけ最適化されていないため、最適化しないことで協力します。

ので、次のコードは、あなたが望むように動作します:あなたが望むよう

def lv1(d): 
    exec "" 
    locals().update(d) 
    print zap 

lv1({'zap': 23}) 

それは23を発します。

私はそれは技術が推奨されていないことが、上記「無表情なユーモア」から明らかだ願っていますが、私はより良い非常に明示的にスペルアウトしたい:あなたが払っている、print locals()['zap']の代わりにprint zapを書くの怪しげな構文喜びのためにパフォーマンスの点ではかなりの価格。それでも、あなたがやっていることや理由を本当に知っている経験豊富な経験豊かなプログラマーのために、まれに使用することができるあらゆる種類の危険なツールのように、execが利用できます(または誤って使用できます)あなたの気まぐれで:Pythonはあなたの方法で立っていません! - )

+0

これは本当に使用されているPythonのバージョンに依存するハックのようです。これがうまくいくという保証はありますか? – Johan

+0

対応するPython(1. *または)2. *実装で動作する必要があります。それはPython 3を作る全ポイントが私たちにそのような方法で下位互換性を打ち破ることを可能にすることであったので、それは対応していない3. *実装では動作してはいけません。しかし、 'print goo'もPython 3で動作しなくなりました(' print(goo) 'でなければなりません)ので、' exec'構文とセマンティクスの弱点はほとんど同じではありません。 –

+0

'exec'に送られた裸の文字列はなぜですか? – Geo

0
print size 

コードがコンパイルされるときに "サイズ"がわからないため、機能しません。

def a(dict): 
    locals().update(dict) 
    print locals()["size"] 

def b(): 
    size = 20 
    a(locals()) 

しかし、あなたの質問には既にコメントがあります:これは非常に奇妙なコードです。あなたが本当にやりたいことを説明すれば、もっと良い解決策があると確信しています。

1

これは何とかあなたを助けてくれますか?

def print_size(size=None): 
    print(size) 

dict = {'size': 'XXL'} 
print_size(**dict) 
1

あなたは、他の機能の範囲にアクセスするためにクロージャを使用することができます。

def b(): 

    def a(): 
    print size 

    size = 20 
    a() 

トリックは、互いに一緒に属する機能をスタックすることです。このようにして、内部関数aは外部関数bのローカル変数にアクセスできます。

あなたが本当に何をしているのかわからないので、これが役立つかどうかはわかりません。

0

私は知っている、私の知っている、質問は古いと受け入れられた答えはすでに素晴らしいです。

明白だが言及されていないので、2セントを追加するだけです。サイズを明示的に(デフォルト)値に割り当てることでサイズをローカルにします。

def a(dict): 
    size = 20 # size default value <- quick (and dirty?) fix 
    locals().update(dict) 
    print (size) 

def b(): 
    size = 20 
    a(locals()) 

だから、()に追加した行(size = 20は)のpython3互換性および最適化の欠点なしであり、サイズはexecために必要とすることなく、実際のローカル変数であることができます。

どのように役立つだろうか???それはpython2の構文エラーを発生させますが、ただのpython3で働くよう

まあ、それを我々はpython2でdef f(x, *args, y=10)のようなものを実装することができます。

def f(x, *args, **kwargs): 
    y = 10 
    locals().update(kwargs) 
    print (x, y) 

python2とのpython3で作品上記の例で何をしている

関連する問題