web-dev-qa-db-ja.com

すべての定義経済変数を表示する

私は現在Pythonシェルで計算をしています。私が欲しいのは、それまでに定義されたすべての変数を見ることができるMatlabスタイルのリストです(だから私はどの名前を使ったか、それらの値などを知っています)。

方法はありますか、そしてそれをどのようにして行うことができますか?

236
Rook

あなたが使うことができるいくつかのこと:

  • dir()はスコープ内変数のリストをあなたに与えるでしょう:
  • globals()はあなたにグローバル変数の辞書を与えるでしょう
  • locals()はあなたに局所変数の辞書を与えるでしょう
294
RedBlueThing

可能であれば、 IPython を使用することをお勧めします。

現在のすべてのユーザ定義変数のリストを取得するために、IPythonはwhoという名前のマジックコマンドを提供します(automagic機能を除いて、マジックの前にモジュロ文字を付ける必要があります有効になっています):

In [1]: foo = 'bar'
In [2]: %who
foo

whosマジックを使って詳細を知ることができます。

In [3]: %whos
Variable   Type    Data/Info
----------------------------
foo        str     bar

他にもたくさんの魔法が利用可能です。 IPythonは基本的にステロイドのPythonインタプリタです。便利なマジックの1つにstoreがあります。これにより、セッション間で変数を保存できます(pickleを使用)。

数分あれば、Jeff Rushの優れた IPythonデモのスクリーンキャスト を調べてください。

注意:私はIPython Devとは関係がありません - 満足しているユーザーです。

187
Chris Lawlor

RedBlueThingとアナログが言ったように:

  • dir()はスコープ内変数のリストを提供します
  • globals()はグローバル変数の辞書を提供します
  • locals()はローカル変数の辞書を提供します

インタラクティブシェル(バージョン2.6.9)を使用して、変数a = 1およびb = 2を作成した後、dir()を実行すると、

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']

locals()を実行すると、

{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}

この場合、globals()を実行すると、locals()とまったく同じ答えが得られます。

私はどのモジュールにも入っていないので、すべての変数はローカル変数とグローバル変数の両方として利用できます。 locals()およびglobals()は、変数の値と名前をリストします。 dir()は名前のみをリストします。

モジュールをインポートして、モジュール内でlocals()またはglobals()を実行すると、dir()はまだ少数の変数のみを提供します。上記の変数に__file__を追加します。 locals()globals()も同じ変数をリストしますが、__builtin__のディクショナリ値を出力する過程で、組み込み関数、例外、上記のような簡単な<module '__builtin__' (built-in)>ではなく、「'type': <type 'type'>」などのタイプ。

dir()の詳細については、New Mexico Techの Python 2.7クイックリファレンス またはibiblio.orgの dir()関数 を参照してください。

locals()およびglobals()の詳細については、Dive Into Pythonの-​​ localsおよびglobals およびニューメキシコの globals に関するページを参照してください。技術.

[コメント:@Kurt: enumerate-or-list-all-variables-in-a-a-program-of-your-favorite-language-here へのリンクを与えましたが、その答えには間違いがありますそれ。問題は次のとおりです。その例のtype(name)は常に<type 'str'>を返します。質問に答える変数のリストを取得しますが、それらの横に誤ったタイプがリストされます。この例では、すべての変数が文字列であったため、明らかではありませんでした。ただし、返されるのは、変数の型ではなく、変数の名前の型です。これを修正するには:print type(name)の代わりにprint eval('type(' + name + ')')を使用します。回答セクションにコメントを投稿したことをおpoびしますが、コメントを投稿する権限がなく、他の質問は終了します。]

44
Linguist

名前を取得するには

for name in vars().keys():
  print(name)

値を取得するには

for value in vars().values():
  print(value)

vars()はオプションの引数を取り、オブジェクト自体の中でどのvarsが定義されているかを調べます。

33
Brian R. Bondy

地元の人を印刷()

コメントから編集を続けた。

印刷時に見栄えをよくするには:

import sys, pprint
sys.displayhook = pprint.pprint
locals()

それはあなたにもっと垂直方向のプリントアウトを与えるでしょう。

14
Harold

dir()は現在のすべてのインポート、および変数を返します。

変数だけが必要な場合は、varScore、varNamesなど、dirから抽出しやすい命名規則をお勧めします。

そのように、あなたは単にこれをすることができます:

for vars in dir():
 if vars.startswith("var"):
   print vars

編集

すべての変数をリストしたいが、インポートされたモジュールと次のような変数を除外する場合。

__builtins__

あなたはそのようなものを使うことができます:

import os
import re

x = 11
imports = "os","re"

for vars in dir():
    if vars.startswith("__") == 0 and vars not in imports:
        print vars

お分かりのように、変数であるため、変数 "imports"が表示されます(Tuple)。簡単な回避策は、Wordの「imports」をインポートタプル自体に追加することです。

10
John T

もう少し賢い(Python 3)方法:

def printvars():

   tmp = globals().copy()
   [print(k,'  :  ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]
6
jamk

globals()、locals()、vars()、およびdir()はすべてあなたが望むものを手助けするかもしれません。

3

私のPython 2.7インタプリタでは、MATLABに存在するのと同じwhosコマンドがPythonに存在します。これは、MATLABのアナログ(変数名、型、および値/データ)と同じ詳細を示します。

Pythonインタプリタでは、whosは "interactive名前空間"内のすべての変数をリストします。

3
Babak
def MyWho():
     print [v for v in globals().keys() if not v.startswith('_')]

これは対話型シェルで定義する必要があります。

インポートos、a = 10、インポートsys、MyWho()

['a'、 'MyWho'、 'sys'、 'os']

1
Jamie