python デコレータ準備 関数には アドレス と 実行 がある

QIITAの解説は変数のネーミングが紛らわしくて余計混乱する。aとかbで良いし、スコープが違っても違う変数名を使ってほしい。頭使えないのですごく時間使う(ToT)

関数の()は飾りやおまけじゃない(と思う)

関数は f() とカッコが付けば実行される

関数が引数になるときは g(f) と引数部分では()が付かない「アドレス渡し」が多い。

アドレスを渡して準備をしてその時を待つのだ、t= threading.Thread(target=f)なんかそうですね。

ところが 引数の場合、g( f() ) とカッコをつけて実行保証渡しにしても良いようだ。

()を付けたときと付けない時を試してみた

def fa(f):
    print('fa')
    return f

def fb():
    print('fb')

c = fa(fb) #関数の引数に関数のアドレスを渡してスタンバイする
c           #実行
print('---------') #見やすいように区切り
d = fa(fb()) #関数の引数に実行形式の関数を渡してスタンバイ
d            #実行

結果は

fa
---------
fb
fa

想像解説

c 実行形式の関数が代入されたので実行
fa実行(引数はfbのアドレス)
print('fa')
return fb アドレスをそのまま帰す
fbのアドレス


print('---------')


d 実行形式の関数が代入されたので実行
fa実行(引数はfb()の実行命令)
print('fa')
return fb() 実行命令をそのまま返す
fb()実行
print('fb')


いや、やっぱり解らん

def fa(f):
    print('fa')
    return f

def fb():
    print('fb')

fa(fb)()
print('---------')
fa(fb())
fa
fb
---------
fb
fa

higher-order function 高階関数にする

高位関数でいいんじゃね? 

def fa(f):
    def fi():
        print('fa')
        f()
    return fi

def fb():
    print('fb')

fa(fb)
print('---------')
fa(fb)()
---------
fa
fb

fa(fb)()

美しくないのに動いてしまう!

正直解らん

因数分解が出来ないからか?

決め事を知らないだけか?

助けてくれ

def fa(f):
    def fi():
        print('fa')
        f()
    return fi
@fa
def fb():
    print('fb')

fb()
fa
fb

デコレータ出来ましたけど意味がわかってない。

挫折しそうな焦燥感、余計なことやるからか?

(-_-;)

コメント

タイトルとURLをコピーしました