質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

11247閲覧

Pythonの関数に渡す引数の引数名を取得したい

Justmeaning

総合スコア13

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/07/08 13:59

渡す引数名の違いによって処理を若干変える関数を作りたいと思っています。

sunny = [1,3,4,5,6,8,10,17,20,25,27,28] rainy = [2,7,11,12,14,15,19,21,22,23,24] cloudy = [9,13,16,18,26,29,30] def Wforecast(weather): print("In this month, " + (変数名) + " days were below:) print(weather)

このように、変数名自体を使いたいのですが、どのようにして取って来られるでしょうか。自分ではクラスを作ってnameメンバを作るか、変数名を別の変数に格納して引数を2つにして渡すことしか思いつきませんでした。

引数を1つにしたままで、名前を取って来られる方法が他にあったら教えてください。

*実際のプログラムでは多重リストを使ってそれに対して処理をかけているので、リストの最後に名前を入れる、などは難しいかと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

BJCRobotさんとのやり取りを眺めて試しに作ってみたら、
こう書けば質問の本来の意図したい挙動なのかなと思うのが出来たので投稿します。

python

1import inspect 2 3sunny = [1,3,4,5,6,8,10,17,20,25,27,28] 4rainy = [2,7,11,12,14,15,19,21,22,23,24] 5cloudy = [9,13,16,18,26,29,30] 6 7 8 9def Wforecast(weather): 10 frame = inspect.currentframe() 11 stack = inspect.getouterframes(frame) 12 val_name = stack[1].code_context[0].split('(')[1].split(')')[0] 13 print("In this month, " + val_name + " days were below") 14 print(weather) 15 16Wforecast(sunny)

挙動の整理

自身の整理を兼ねて「こんな挙動でした」というのをまとめてみると。

frame = inspect.currentframe() stack = inspect.getouterframes(frame)

この辺で呼び出し情報が取れます。

print(stack) [ FrameInfo(frame=<frame object at 0x10c4dce10>, filename='teratail.py', lineno=11, function='Wforecast', code_context=[' stack = inspect.getouterframes(frame)\n'], index=0), FrameInfo(frame=<frame object at 0x10c4dc828>, filename='teratail.py', lineno=18, function='<module>', code_context=['Wforecast(sunny)\n'], index=0) ]

実引数の名前が分かるところまで遡れられれば、code_contextのテキストを加工してどうにかできないことはなさそう?という感じになりました。

投稿2016/07/09 07:08

attakei

総合スコア2738

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr_Roboto

2016/07/09 07:57

ありがとうございます(あげときます) なるほど、Python使いじゃない私にはさっぱり分からない世界になりましたねぇ 個人的には、通常のアプリでここまでして取る必要があるのかという気もしますが。 ロジックが負えなくなるので、こういうことやるのは、フレームワークとか解析ツールのような役目じゃないかと・・・ (Javaでいうリフレクションみたいなものかな) まぁでも面白い話題ではありますね ^^
guest

0

こんな風に書くみたいです。

Python

1def Wforecast(weather): 2 print("In this month, " + Wforecast.func_code.co_varnames[0] + " days were below:") 3 print(weather) 4 5Wforecast("Rain")

実行結果
In this month, weather days were below:
Rain

参考にしたページです。
28.13. inspect — 活動中のオブジェクトの情報を取得する — Python 2.7.x ドキュメント
func_code が便利すぎる件 - へたれプログラマな日々
要素の取得 - タプル - Python入門

Pythonはよく知らないので、間違ってたらゴメンナサイ
(ってグラフサイズの質問の人ですね、再びこんにちは ^^)

投稿2016/07/08 14:53

Mr_Roboto

総合スコア2208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Justmeaning

2016/07/09 03:49

再び回答ありがとうございます! 残念ながら、その方法だと関数内に書かれている引数名しか取れないんですよ。 渡す前の名前を取りたいんですが、案外方法がわからないのです。
Mr_Roboto

2016/07/09 03:53

あー、そういうことですか、ちょっと質問からは読み取りにくいですね。 できれば編集しといて頂けると今後見る人の役にもたつと思います。 渡す前って取れるのかな・・・ちょっと難しい気もするけど、 どうしてそのようなことがしたいのかも書くといい回答が得られるかも知れませんね ^^
Justmeaning

2016/07/09 04:37

読み取りづらいですか。そこまで正確な名前に詳しいわけではないので、結構調べたのですが「渡す引数名」以外に表現の仕方がわかりませんでした。 どうしてそのようなことがしたいかについては、コードのままなので、これも重複になるかと思います。
Mr_Roboto

2016/07/09 04:47

えーと、引数には仮引数と実引数と呼ばれる区別があって、私が書いたのは仮引数の取り方ですね。渡す側の引数の呼び名は、実引数といいます。 なので、質問のタイトル等が、例えば 「Pythonの関数に渡す実引数の名前を関数内で取得したい」 とかだったらわかると思います。 で、ソースに (今のままで追加するとすれば) Wforecast(変数名) と1行追加すればいいかと思います。 一番間違い無いのは、以下のように書けばいいかなと思います。 def Wforecast(仮引数名): print("In this month, " + (実引数名) + " days were below:) print(weather) Wforecast(実引数名) 名前は同じ言葉でも若干取り方が人によって違ったりするので 悩ましいところですよね ^_^;
Justmeaning

2016/07/12 11:13

ああ、なるほど!そういう名前をだいぶ前に違う言語で勉強した気がします。詳しい解説ありがとうございます。これだと明確ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問