web-dev-qa-db-ja.com

pythonで変数名を印刷するにはどうすればよいですか?

choiceという名前の変数があり、2と等しいとします。変数の名前にどのようにアクセスしますか?と同等のもの

In [53]: namestr(choice)
Out[53]: 'choice'

辞書作成に使用します。これを行うには良い方法がありますが、私はそれを逃しています。

編集:

したがって、これを行う理由は次のとおりです。実行時に微調整したい、または微調整したくない複数のパラメーターを使用してプログラムを呼び出すデータ分析を実行しています。次の形式の.configファイルから、前回の実行で使用したパラメーターを読み取りました

filename
no_sig_resonance.dat

mass_peak
700

choice
1,2,3

値の入力を求められると、以前に使用された値が表示され、空の文字列入力は以前に使用された値を使用します。

私の質問は、これらの値がスキャンされたディクショナリを作成することになるためです。パラメーターが必要な場合は、ファイルにアクセスしてパラメーターを見つけるget_paramを実行します。

.configファイルを1回読み取り、そこから辞書を作成することで、問題をすべて回避できると思います。元々...覚えていない理由でそれを避けました。コードを更新するのに最適な状況です!

61
physicsmichael

あなたが主張する場合、ここにいくつかの恐ろしい検査ベースのソリューションがあります。

import inspect, re

def varname(p):
  for line in inspect.getframeinfo(inspect.currentframe().f_back)[3]:
    m = re.search(r'\bvarname\s*\(\s*([A-Za-z_][A-Za-z0-9_]*)\s*\)', line)
    if m:
      return m.group(1)

if __== '__main__':
  spam = 42
  print varname(spam)

それがあなたがあなたが持っている問題を再評価し、別のアプローチを探すことを刺激することを願っています。

90
Constantin

元の質問に答えるには:

def namestr(obj, namespace):
    return [name for name in namespace if namespace[name] is obj]

例:

>>> a = 'some var'
>>> namestr(a, globals())
['a']

@ rbrightが既に指摘している あなたが何をするにしても、おそらくもっと良い方法があります。

59
jfs

Pythonではなく名前のみ)には変数がないため、できません。

例えば:

> a = [1,2,3]
> b = a
> a is b
True

これらの2つのうち、正しい変数はどれですか? abに違いはありません。

以前に 類似の質問 がありました。

13
Georg Schölly

これをしようとしている場合、それはあなたが何か間違ったことをしていることを意味します。代わりにdictの使用を検討してください。

def show_val(vals, name):
    print "Name:", name, "val:", vals[name]

vals = {'a': 1, 'b': 2}
show_val(vals, 'b')

出力:

Name: b val: 2
10
recursive

特定のソリューションの詳細を尋ねるのではなく、直面している問題を説明することをお勧めします。より良い答えが得られると思います。あなたがやろうとしていることを何でもするより良い方法がほぼ確実にあるので、私はこれを言います。この方法で変数名にアクセスすることは、どの言語でも問題を解決するために一般的に必要ありません。

つまり、すべての変数名は既に組み込み関数 locals および globals からアクセスできる辞書にあります。検査しているスコープに対して正しいものを使用してください。

これらの辞書を検査するためのいくつかの一般的なイディオムの1つは、簡単な文字列補間です。

>>> first = 'John'
>>> last = 'Doe'
>>> print '%(first)s %(last)s' % globals()
John Doe

この種のものは、名前で変数を検査する必要がある場合でも、代替よりも少し読みやすい傾向があります。

7
Ryan Bright

構成パラメーターの読み取り方法の修正された質問については、時間と労力を節約して、 ConfigParser または(私の好みのツール) ConfigObj を使用することを強くお勧めします。

彼らはあなたが必要とするすべてを行うことができ、使いやすく、他の誰かがそれらを適切に機能させる方法をすでに心配しています!

2
James Brady

このような何かがあなたのために働くでしょうか?

>>> def namestr(**kwargs):
...     for k,v in kwargs.items():
...       print "%s = %s" % (k, repr(v))
...
>>> namestr(a=1, b=2)
a = 1
b = 2

そしてあなたの例では:

>>> choice = {'key': 24; 'data': None}
>>> namestr(choice=choice)
choice = {'data': None, 'key': 24}
>>> printvars(**globals())
__builtins__ = <module '__builtin__' (built-in)>
__= '__main__'
__doc__ = None
namestr = <function namestr at 0xb7d8ec34>
choice = {'data': None, 'key': 24}
2
myroslav

熱心な評価では、変数を見るといつでも変数は本質的に値に変わります(言い換えると)。つまり、Pythonには組み込みの namespaces があります。たとえば、locals()は、関数の変数名を値にマッピングする辞書とglobals( )はモジュールに対して同じことを行います。

for name, value in globals().items():
    if value is unknown_variable:
        ... do something with name

Locals()およびglobals()にアクセスするために何かをインポートする必要はないことに注意してください。

また、値に複数のエイリアスがある場合、ネームスペースを反復処理しても最初のエイリアスのみが検出されます。

1
Nikhil Chelliah