変数の名前を取得する方法とは?

このQ&Aのポイント
  • Python 2.7.8において、変数の名前を取得する方法について説明します。
  • foo関数を実行し、引数として渡された変数の名前を取得するためには、inspectモジュールのstack関数を使用します。
  • inspect.stack関数を使用することで、呼び出し元のスタックのフレームレコードのリストが取得できます。
回答を見る
  • ベストアンサー

変数の名前を取得

Python 2.7.8にて、 def foo(arg):  print arg a = 123 print a を実行すると123が表示されます。 これを、同時に   "a" も表示したいです。つまり引数の入っていた変数の名前を得たいです。 出来ればpyファイル名も得たいです。 ネットを参照して、その変数の場所(行位置)は inspect.stack()[1][2] で得られることが分かりました。 これを元に検索すると、inspect.stackの説明がありました: inspect.stack([context])¶(原文) 呼び出し元スタックのフレームレコードのリストを返します。最初の要素は呼び出し元のフレームレコードで、末尾の要素はスタックにある最も外側のフレームのフレームレコードとなります。 この説明の意味が分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

変数は難しいと思います。 得たファイル名と行番号から、ソースコードを読み出して解析するしかないように思います。 a=1 b=a func(a) では、「変数a」を渡すわけではなく、「整数オブジェクト1」が渡されます。 「整数オブジェクト1」は、変数aでもあり、変数bでもあります。

remokon
質問者

お礼

返答ありがとうございます 分かりました 今後もおねがいします

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

[inspect.stack呼び出し元のフレームレコード(現在のフレームレコード), 現在の関数の呼び出し元のフレームレコード, それの呼び出し元のフレームレコード, ... 一番上の呼び出し元のフレームレコード ] その関数の説明のちょっと上に http://docs.python.jp/2/library/inspect.html#inspect-stack > “フレームレコード”は長さ6のタプルで、以下の値を格納しています: > フレームオブジェクト、 > ファイル名、 > 実行中の行番号、 > 関数名、 > コンテキストのソース行のリスト、 > ソース行のリストにおける実行中の行のインデックス。 とあります。 ファイル名と行番号は解決でしょう。

remokon
質問者

お礼

返答ありがとうございます ファイル名を得ることが出来ました。 変数名(質問文中の例では"a")を得る方法はありますか。

関連するQ&A

  • 別々に実行のpythonでグローバル変数できる?

    python初心者です。 例えばなんですが、 test1.py test2.py 2つのpythonコードを用意して、 test1.py側で1秒間ごとにインクリメントしていくループの処理を実行しながら、test2.pyではcronなどで定期実行させて、test1.pyでインクリメントさせている変数をprintしていくようなコードを作ることは可能でしょうか? 今回のような別々に実行させておいて、変数をtest1.py、test2.py間で変数を共有するようなグローバル変数というのはできますでしょうか? ご教示頂きますよう、どうぞよろしくお願い致します。

  • pythonにCでのexternはありますか

    python初心者です。 a.py, b.pyがあります。 <a.py> import b bar=123 b.foo() <b.py> def foo  global bar  print bar 実行すると"123"が表示されず失敗します。 Cだとexternすれば外部参照で希望通りに成功します。 CとPythonは違うことは知っていますが、Pythonで実現できないでしょうか。 又は類似の手段はありますか。

  • pythonのCGIでページを遷移したい

    PythonのCGIserverを使っています。 /cgi-bin/hoge.py から /cgi-bin/foo.py へとページを遷移させたいのですが、うまくいきません。 どうすればいいですか? 以下、hoge.pyのソースです。 #!/usr/local/bin/python # coding: utf-8 (中略) print "Location: /cgi-bin/foo.py\n\n" 他の方法として、 import foo として、fooの関数やメソッドを呼ぶことも考えたのですが、 これもうまくいきません。。

    • 締切済み
    • CGI
  • 複数の配列の要素を繰り返し処理をして書き込むと変数の中身がおかしくなってしまいます。

    いつもお世話になります 複数の配列の要素を繰り返し処理をして書き込むと変数の中身がおかしくなってしまいます。 ポストメソッドで複数のテキストを受けて書き込みたいのですが、書き込む内容が""になってしまいます print qq|<form action=\"$myself\" method=\"POST\">\n|; LOOP: foreach $i (0..7) { foreach $j ($x..$x + 3) { print qq|@eqipument[$j]<input type=text name="arg_$j" size_1=35>\n|; last LOOP if ($j == $#eqipument); } $x = $x + $x_colm; print qq|<br>\n|; } @eqipumentの配列の要素を変数arg_$jで配列が終わるまで繰り返して入力画面を表示させます その後 # デスク書き込み open(OUT,">>$logfile") || &error("Write Error : $logfile"); $j = 0; foreach(0..@eqipument) { print OUT "$in{'arg_$j'}<>"; $j++; } close(OUT); として書き込みをすると、変数arg_$jの内容が空になってしまい<>だけがかきこまれます 変数部分を arg_0,arg_1,arg_2.... と明示して書くときちんと入力画面で入力した テキストが書きこめれますが、入力項目も多いですしプログラム的にも見難いので 繰り返し処理で書き込みをしたいのですがなぜこのような結果になるのか(arg_$jの内容が空になる)理解できません又 print qq|$in{'arg_$j'}\n|;として 変数の中身を検証するためにコンソールに出力すると中身は "" になっています 宜しく御教授お願いします。

    • ベストアンサー
    • Perl
  • py2app

    PythonのGUIアプリを作っていて、それをpy2appにてビルドしたのですが起動に失敗してしまいます。 Pythonのバージョンは2.7、wxPythonのバージョンは 2.8、py2appのバージョンは0.64です。 以下のような流れで行いました。 $ /usr/local/bin/py2applet --make-setup foo.py $ python setup.py py2app --argv-emulation -A できあがったfoo.appを実行すると以下のようなエラーがコンソールに吐かれて実行できません。 12/03/10 0:54:50.233 com.apple.launchd.peruser.501: ([0x0-0x144144].org.pythonmac.unspecified.foo[6036]) Exited with code: 255 単純なハローワールドアプリは実行してもエラーは出ませんでした。 また、単純なwxPythonアプリは同じエラーを吐いていました。 wxPythonに対応していないのでしょうか。 しかし、ネットで調べてみるとwxPythonを使用したアプリも動かせているようです。 ご教授よろしくお願いします。

  • python スクリプトファイルの実行

    プログラム初心者です。 pythonを始めて間もないです。 環境はwindows XPでpython2.6を使っています. IDLEエディタでprint "hello" と記入し、test.pyを作成しました。 保存先はC:\Python26になります。環境変数もコマンドラインでpythonと入力すれば起動してくれるように設定しています。 そこで、コマンドラインにpython test.pyと入力すると、File"<stdin>",line 1 python test.py SyntaxError: invalid syntax と返ってきます。 色々調べてみたのですが解決できず質問させていただきました。 どうかよろしくお願いします

  • FORTRAN90で書式に変数を使いたい

    FORTRAN90で書式に変数を使いたい 配列aの要素数が3である場合の書き出し方は例えば、  print '(3I5)', a ですよね。 配列aの要素数がnである場合、どう書き出せばよいのでしょうか?  print '(nI5)', a だとエラーが出ます。 繰り返し文を駆使する以外にないのでしょうか?あまり美しくない気がします。

  • python プログラミング

    pythonで、 def CircleArea(): a=r*r*3.14 print(r,a) というプログラムをunixのvimでcircle.pyで保存しました。 今度はこれをpythonで実行したいと思って, ターミナルに, circle.pyと入力しましたが, 実行しません。どうすればよろしいでしょうか? よろしくお願いします。

  • 移動元のURLを変数に取りたい

    例えば、 http://www.hoge.jp/foo.html に、 <a href="hoge.php"></a> というリンクが張られているとして、このリンクをクリックしてhoge.phpに移動したときに、移動元のURLアドレス「http://www.hoge.jp/foo.html」を変数に取りたいのですが、方法をご存知の方、教えてください。 (PHP4です)

    • ベストアンサー
    • PHP
  • スタックを用いて整数配列を入れ替えるプログラムがわかりません…!

    C言語プログラミングの超初心者です。 「スタックを用いて0~9の10個の整数配列を5個ずつ並び替えるプログラムをつくる」(0123456789→4321098765) という課題に取り組んでいるのですが、 お恥ずかしいのですがスタック・プッシュ・ポップの関係を何とか理解した程度で、どのようにプログラミングを組めばよいのかわかりません…! 上記の課題の前提として、「0~100までの整数の並び順を逆にする」(0 1 2…100→100 99 98…0)が与えられていました。途中で分からなくなってしまっため、恥ずかしながら途中までなのですが、記述させていただきます。こちらのプログラムが参考になるようであれば、使っていただければ幸いです。 #include<stdio.h> #include<stlib.h> #define STACKLENGTH 100 #define LENGTH 10 int stack[STACKLENGTH]; int stack_p = 0; void print(void); void Print(char*,int*a,int); int main(int arg,char** argv){ int a[LENGTH]; int ii; for (ii=0; ii<LENGTH, ii++){ a[ii]= rand()%101; } Print("入れ替え前",a,LENGTH); for(ii=0; ii<LENGTH; ii++){ push(a[ii]); } for (ii=0; ii){ a[ii]=Pop(); } Print("入れ替え後",a,LENGTH ); } お手数をおかけします。とても困っており、ぜひご指導をお願いいたします…!