質問したいこと
関数内に関数があるときに、関数の中にある関数に括弧も引数もないにもかかわらず、その関数の中にある関数に引数が実際には渡されていて計算が実行されていること。
質問したい内容としては
0. この本質である関数内に引数が渡されていないにもかかわらず実際は引数が渡されている原理や過程をわかりやすく教えていただけると嬉しいです
- この仕組みを書くにはどのようなコードの書き方をしたらいいのか。
該当のソースコード
_rexp.sub(_replace,string)の中の_replaceにはかっこが入っていないにもかかわらず
def _replace(m)とmという引数が設定されていてその引数も与えられている。
import sys, re def f(string): print(_rexp.sub(_replace, string)) return _rexp.sub(_replace, string) #<- 第1引数に関数を指定、 #_replaceには引数や括弧が書かれていない _rexp = re.compile(r'\{(\w+)\}') def _replace(m): #<- 引数の「m」は正規表現のマッチデータ key = m.group(1) frame = sys._getframe(2) #<- f()の呼び出し元のスタックフレーム try: if key in frame.f_locals: #<- ローカル変数を検索し、 return str(frame.f_locals[key]) #<- 置換する。 if key in frame.f_globals: #<- グローバル変数を検索し、 return str(frame.f_globals[key]) #<- 置換する。 return "{%s}" % key #<- なければ置換しない。 finally: del frame ## 使い方 w = 2560 h = 1600 print(f("width={w}, height={h}"))
試したこと
自分なりにre.pyを調べてみたり、検索してみたのですがあまりこれに該当するものは出てこなく、括弧をつけない関数はfunctionオブジェクトになるというような関係のサイトしか出会えませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。