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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

解決済

1回答

968閲覧

python 関数名(編集更新出来ない為)

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2019/07/27 03:28

一度質問した内容ですが、質問の編集が出来なかった為、改めての質問

pythonで関数名や引数を取得する方法が知りたいです。

特に知りたいのが関数名であり、インターネット上にあるプログラムを採用していますが、、
任意の文字:'123abc'
条件   :'[0-9]+'
出力文字 :{'a':'123','s':'abc'}

python

1import re 2 3def unit(a): 4 def m(s): 5 ans = {'a':a,'s':s} 6 return ans 7 return m 8 9def bind(m,f): 10 def mf(s): 11 r = m(s) 12 r = r and f(r['a'])(r['s']) 13 return r 14 return mf 15 16def newParser(function): 17 return bind(function,unit) 18 19def pattern(e): 20 def pattern_function(s): 21 #今回の場合、e:[0-9]+,s:'123abc' 22 ans = {'a':'', 's':''} 23 n = len(re.match("\s*",s)[0]) 24 s = s[n:] 25 #sが文字123abcの前に空白があれば削除する(s:'123abc') 26 r = re.match(e,s)[0] 27 #r:'123' 28 if(r): 29 ans['a'] = r 30 ans['s'] = s[len(r):] 31 return ans 32 #ans:{'a':'123','s':'abc'} 33 print(newParser(pattern_function)) 34 return newParser(pattern_function) 35 36 37num = pattern("[0-9]+") 38print(num("123abc")) 39 40def hogeFunction(): 41 f = inspect.currentframe() 42 print(f) 43 return inspect.getframeinfo(f)[2] 44 45print(hogeFunction())

実行結果

<function bind.<locals>.mf at 0x000002BEFE3B8268>
{'a': '123', 's': 'abc'}

<frame at 0x0000023C38A13908, file 'C:\Users\user.DESKTOP-BPPQ15G\Documents\zikken\zikken.py', line 84, code hogeFunction> hogeFunction 続行するには何かキーを押してください . . .

質問内容

上記のプログラムを実行すると、上記の実行結果になるのですが、
print(newParser(pattern_function))
を実行すると、
<function bind.<locals>.mf at 0x000002BEFE3B8268>
となるのですが、これを
{'a': '123', 's': 'abc'}
などの実行結果で表示する方法はあるのでしょうか?

もちろん、unit関数内やpattern_function関数内などをprintすれば実行結果は確認できますが
print(newParser(pattern_function))
を行った結果を出したいです。

追記

関数名の取得方法を教えて頂きありがとうございます。
余計に分からなく質問ですが、
関数の引数に「num = pattern("[0-9]+")」などを「**kwargs」などで配列に入れ、
その中から、"pattern("[0-9]+")"の状態を作ることは可能ですか?
プログラムを受けて
文字でプログラムを記載し、
実行も行うような形で、、
分かりにくいですかね?

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

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

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

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

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

guest

回答1

0

ベストアンサー

patternが呼ばれる時点では、どんな文字列を解析対象にするのかが定まりませんから、その条件下では何をやっても無理、ということになるのではないでしょうか。

それを与えても良い、という条件下では可能ですが。

python

1def pattern(e, s=""): 2 def pattern_function(s): 3 #今回の場合、e:[0-9]+,s:'123abc' 4 ans = {'a':'', 's':''} 5 n = len(re.match("\s*",s)[0]) 6 s = s[n:] 7 #sが文字123abcの前に空白があれば削除する(s:'123abc') 8 r = re.match(e,s)[0] 9 #r:'123' 10 if(r): 11 ans['a'] = r 12 ans['s'] = s[len(r):] 13 return ans 14 #ans:{'a':'123','s':'abc'} 15 print(newParser(pattern_function)(s)) 16 return newParser(pattern_function) 17 18 19num = pattern("[0-9]+", s="123abc") 20

これはとても非合理なことをしている(余計な機能をpatternにもたせている)訳で、patternの中でprintするのをやめて、print(num("123abc"))だけにした方が理にかなっているでしょう。

print(newParser(pattern_function))
を行った結果を出したいです。

行った結果はちゃんと表示されています。定義された関数内関数が表示されています。

関数の引数に「num = pattern("[0-9]+")」などを「**kwargs」などで配列に入れ、
その中から、"pattern("[0-9]+")"の状態を作ることは可能ですか?

この文章から要件を正確に読み取ることは私にはできないのでエスパー回答になりますが、要はpatternの返り値を中身のわかるようなフォーマットで表示したいということであれば、クラスで実装して__call____str__, __repr__あたりをいじるというのが正攻法でしょうか。

python

1class pattern: 2 def __init__(self, e): 3 self.e = e 4 5 def __call__(self, s): 6 #今回の場合、e:[0-9]+,s:'123abc' 7 ans = {'a':'', 's':''} 8 n = len(re.match("\s*",s)[0]) 9 s = s[n:] 10 #sが文字123abcの前に空白があれば削除する(s:'123abc') 11 r = re.match(self.e,s)[0] 12 #r:'123' 13 if(r): 14 ans['a'] = r 15 ans['s'] = s[len(r):] 16 return ans 17 else: 18 return None 19 20 def __str__(self): 21 return self.__repr__() 22 23 def __repr__(self): 24 return f"pattern(r'{self.e}')" 25 26num = pattern(r"[0-9]+") 27print(num) # => pattern(r'[0-9]+') 28

このコードの意味についてちゃんと解説しようとすると大変すぎるので、上であげたキーワードで検索していただいて理解していただくことが望ましいです。


あと、質問文の編集の方法は覚えてください。

パソコンのブラウザで開いて、質問文末尾の左下にある編集ボタンを押して開くだけです。とても親切な画面が出るので、指示通り操作するだけです。

どうしても上手く行かなければ、他のブラウザで試すなどもしてみてください。

投稿2019/07/27 20:49

hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2019/08/10 08:24

返信が遅れて申し訳ありません。 「print(newParser(pattern_function))」 が出来る事で自身で実際にどこがどこをやっているのか答の動作が少しばかりわかりました。 一応の質問にはなるのですが、 「 関数の引数に「num = pattern("[0-9]+")」などを「**kwargs」などで配列に入れ、 その中から、"pattern(\"[0-9]+\")"の状態を作ることは可能ですか? 」 この質問の意味として、以下のプログラムを加えて実行した時に「pattern("[0-9]+")」と表示することは、不可能なのでしょうか? プログラム def name(**kwargs): print(kwargs) return 0 name(num = pattern("[0-9]+")) 実行結果 {'num': <function pattern.<locals>.pattern_function at 0x00000233BBC386A8>} やりたい事として、別の関数、別のクラスから情報を得ることもしたかった為、このように記載させていただきました。
hayataka2049

2019/08/10 11:11

私の回答のpatternの実装にすれば{'num': pattern(r'[0-9]+')}にはなります(表示はr文字列にしておいた方が良いでしょう)。その上でprint(kwargs["num"])とすればお望みの結果かと。キーワード引数が1つだけであることが保証されるなら、引数の名前に関わらず唯一の値を取り出すこともできます。
退会済みユーザー

退会済みユーザー

2019/08/12 07:35

了解です。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問