2017-07-08 10 views
0

この質問はここで尋ねられる他の質問と似ていますが、回答を読んだ後、私はそれをつかむことはできません。 Pythonでネストされた関数を使ったスコープ

新しいコードをスケッチしながら

は、私は自分自身のような文の多くを追加見つける:それはいつも書いていることを面倒になった

print('var=') 
pprint(var) 

ので、私は、私は機能にそれを作ることができると思いました。私は前の行に変数名を印刷したいので、私が試した:

def dbp(var): 
    eval('print(\'{0}=\')'.format(var)) 
    eval('pprint({0})'.format(var)) 

をので、私はのようなものを行うの操作を行います。

foo= 
'bar' 

これがすべてですが印刷さ

foo = 'bar' 
dbp('foo') 

を素晴らしいですが、私がそれを関数で使うために行くと、物事はうんざりします。例えば、

def f(): 
    a = ['123'] 
    dbp('a') 
f() 

は、NameError(NameError:name 'a'は定義されていません)を発生させます。

私の予想は、dbp()はf()のスコープ内のものには読み取りアクセス権を持っていましたが、明らかにそうではありません。なぜ誰かが説明できますか?

また、変数の名前に続けて書式設定された内容を印刷する方が良い方法もあります。

+2

'foo'がモジュールに対してローカルな' DBP( ) 'がモジュールスコープにあるので、モジュールスコープにアクセスできます。 'a'は' f() 'に対してローカルです。' dbp() 'は' f() 'のスコープにアクセスできません。 'f()'の中で 'def dbp()'を実行していた場合、 'f()'のスコープにアクセスできます。この問題のハックは 'locals()'を渡すことであり、 'locals()['a']'を使うことができ、 'eval()'文は必要ありません。 – AChampion

+0

どちらの場合も、文字列を渡すと、evalはその変数を試して印刷します。その変数がevalのスコープにある場合、それが出力されます。それ以外の場合は、そうではありません。 –

+1

なぜ最初に 'print()'が 'eval()'されていますか? 'print( '{0} ='。format(var))'しませんか? – AChampion

答えて

1

を行うことができます。
loggingモジュールは、本当に良い習慣です。デバッグ出力をオン/オフすることができます。あなたはこれを単純化するよう
のPython 3.6はf''文字列を持っています

pprint(f'var=\n{var}`)` 

しかし、ここlocals()を使用して(推奨されません)例を示します

In []: 
def dbp(var, l): 
    print('{}='.format(var)) 
    pprint(l[var]) 

def f(): 
    a = 1 
    dbp('a', locals()) 
f() 

Out[]: 
a= 
1 
+0

合意した:ロギング。私はそれをずっと前に使い、それを忘れてしまった。それは常にマイナーなデバッグ印刷のために過度のように感じましたが、マイナー印刷は常に主要な印刷に変わるようです...私はちょうど習慣を構築する必要があります。 – Andrew

-1

まず、idは、そのコードを実行しようとしている人にとって、高いセキュリティリスクがあると言っています。

ただし、絶対に必要な場合は、これを行うことができます。

def dbp(var): 
    env = {'var': var} 

    # Adding global variables to the enviroment 
    env.update(globals()) 

    eval("print('{0}=')".format(var)) 
    eval('pprint(var)', env) 

def f(): 
    a = ['123'] 
    dbp('a') 

あなたは、あなたが本当にこれを行うには、他の方法を検討すべきである

>>> f() 
a= 
'a' 
+0

'f()'スコープは 'globals()'にありません。 – AChampion

+0

ナンセンスのように見えます。 '['123']'を表示しません。 –

+0

@AChampionあなたは正しいです、私はそれを見落としました。あなたの答えは正しいものです。 –

関連する問題