Pythonã®ã³ãŒããèªãã§ããŠã颿°ã®äžã« @something ãšããèšå·ãã€ããŠããã®ãèŠãŠãããäœã ããïŒããšæã£ãããšã¯ãããŸãããïŒããããã³ã¬ãŒã¿ãŒãšåŒã°ããä»çµã¿ã§ã颿°ã®äžèº«ãäžåæžãæããã«ããã®ååŸã«åŠçã远å ãããæåãã«ã¹ã¿ãã€ãºãããã§ãããPythonãªãã§ã¯ã®åŒ·åãªæ©èœã§ãâš
ãã³ã¬ãŒã¿ãŒã䜿ãããªããããã«ãªãã°ããã°åºåãèªèšŒãã§ãã¯ãå®è¡æéèšæž¬ããã£ãã·ã¥åŠçãªã©ããè€æ°ã®é¢æ°ã«å ±éããåŠçãã1è¡ã§é©çšã§ããããã«ãªããŸããã³ãŒããDRYïŒDon't Repeat YourselfïŒã«ãªããã¬ãã¥ãŒã§ãäžç®çœ®ãããååšã«ãªããŸããð
ãã³ã¬ãŒã¿ãŒãšã¯ããã颿°ã«å¯ŸããŠããã®é¢æ°ã®ã³ãŒãã倿Žããã«åŠçã远å ã»å€æŽããä»çµã¿ã®ããšã§ãããdecorateïŒè£ 食ããïŒããã人ïŒãã³ã¬ãŒã¿ãŒããšããããã§ããðš
äŸãã°ãããã¯ãããã§ãããšè¡šç€ºããã ãã®ã·ã³ãã«ãªé¢æ°ããã£ããšããŸãã
def print_apple():
    print("ããã¯ãããã§ã")
ãã®é¢æ°ã« @exec_time ã®ãããªãã³ã¬ãŒã¿ãŒãã€ããã ãã§ã颿°æ¬äœãæžãæããããšãªããå®è¡çŽåã®æ¥æããšãå®è¡å®äºåŸã®æ¥æããèªåã§è¡šç€ºããããã«æ¹é ã§ããŸããåã颿°ãåŒã³åºããŠããååŸã«æ°ããåŠçãæãŸãââããããã³ã¬ãŒã¿ãŒã®ã€ã¡ãŒãžã§ãã
ããããå颿°ã«æžãå ããã®ã§ã¯ãªãããã³ã¬ãŒã¿ãŒãšããŠå€åŽããä»äžããããšã§ã颿°ã®æ¬äœã¯æ¬æ¥ã®ããžãã¯ã ãã«éäžãããããŸãã
ãã³ã¬ãŒã¿ãŒãèªäœããåã«ãæŒãããŠããã¹ã3ã€ã®ãã€ã³ãããããŸããé çªã«èŠãŠãããŸãããã
Pythonã§ã¯ã颿°ãä»ã®å€ãšåãããªããžã§ã¯ããšããŠæ±ããŸããã€ãŸãã倿°ã«ä»£å ¥ããããåŒæ°ã«æž¡ããããæ»ãå€ãšããŠè¿ãããã§ããã®ã§ãã
def print_apple():
    print("ããã¯ãããã§ã")func = print_apple  # æ¬åŒ§ãã€ããã«ä»£å ¥ïŒåŒã³åºãã§ã¯ãªãïŒ
func()  # â "ããã¯ãããã§ã" ãšè¡šç€ºããã
print_apple ã« () ãã€ããã« func ã«ä»£å
¥ããããšã§ã颿°èªäœã倿°ã«æ ŒçŽã§ããŸãããããåŒã³åºãã°ãå
ã®é¢æ°ãšåãããã«åäœããŸãã
颿°ãªããžã§ã¯ãã¯æ®éã®å€æ°ãšåæ§ã«æ±ããã®ã§ã颿°ã®åŒæ°ã«ããæ»ãå€ã«ã䜿ããŸãã
def repeat_func_twice(func):
    func()
    func()repeat_func_twice(print_apple)  # â "ããã¯ãããã§ã" ã2å衚瀺
ãã®ããã«é¢æ°ãåŒæ°ãšããŠæž¡ããããããããã³ã¬ãŒã¿ãŒã¯ã察象ã®é¢æ°ãåãåã£ãŠãæ¹é ãã颿°ãè¿ãããšããèžåœãã§ããããã§ãã
Pythonã§ã¯é¢æ°ã®äžã«ããã«é¢æ°ãå®çŸ©ã§ããŸããããããã¹ã颿°ïŒå éšé¢æ°ïŒãšåŒã³ãŸãã
def print_text_twice(text):
    def add_exclamation(t):
        return t + "!"
    result = add_exclamation(text)
    print(result)
    print(result)
å
éšé¢æ° add_exclamation ã¯å€ããã¯åŒã³åºãããprint_text_twice ã®äžã ãã§äœ¿ããŸããããã§éèŠãªã®ãã¹ã³ãŒãã®æŠå¿µã§ããPythonã¯å€æ°ãæ¢ããšãããŸãäžçªè¿ãå ŽæïŒé¢æ°ã®äžïŒãæ¢ããèŠã€ãããªããã°äžã€å€åŽãããã«å€åŽâŠâŠãšé ã«æ¢ããŠãããŸããã ããå
éšé¢æ°ã¯ãå€åŽã®é¢æ°ã®åŒæ°ïŒäŸïŒtextïŒã«ãã¢ã¯ã»ã¹ã§ããã®ã§ãããã®æ§è³ªããã³ã¬ãŒã¿ãŒå®è£
ã®éµã«ãªããŸãð
æºåãæŽã£ãã®ã§ãå®éã«ãã³ã¬ãŒã¿ãŒãäœã£ãŠã¿ãŸããããä»åã¯ã颿°ã®å®è¡åã« startãå®è¡åŸã« end ã衚瀺ãããã·ã³ãã«ãªãã³ã¬ãŒã¿ãŒãäœããŸãã
def start_end(func):
    def wrapper():
        print("start")
        func()
        print("end")
    return wrapperdef print_apple():
    print("ããã¯ãããã§ã")decorated = start_end(print_apple)
decorated()
start_end ã¯åŒæ°ãæ»ãå€ãã颿°ãã«ãªã£ãŠãã颿°ã§ããåãåã£ã颿°ã®ååŸã« start/end ã®è¡šç€ºãæãã æ°ãã颿°ïŒwrapperïŒãè¿ããŠããŸããå®è¡ããã°ãstart â ããã¯ãããã§ã â end ã®é ã«è¡šç€ºãããŸãã
æ¯å start_end(print_apple) ãšæžãã®ã¯å°ãåé·ã§ããããPythonã«ã¯@ããŒã¯ïŒã¢ããããŒã¯ïŒã䜿ã£ãç³è¡£æ§æããããåãããšãäžç®ã§ãããåœ¢ã«æžãæããããŸãã
@start_end
def print_apple():
    print("ããã¯ãããã§ã")print_apple()  # â start / ããã¯ãããã§ã / end
ããã ãã§å
ã»ã©ãšå®å
šã«åãåäœã«ãªããŸããããã®é¢æ°ã«ã¯ start_end ãè£
食ãããããšããæå³ãã³ãŒãäžã§äžç®çç¶ã«ãªãã颿°æ¬äœã®ããžãã¯ãäžåæ±ããã«æ©èœã远å ã§ããããšããã®ã@èšæ³ã®é
åã§ãð
å®çšçãªé¢æ°ã¯åŒæ°ãæ»ãå€ãæã€ããšãã»ãšãã©ãå ã»ã©ã®ãã³ã¬ãŒã¿ãŒããã©ããªåŒæ°ã»æ»ãå€ã®é¢æ°ã«ã察å¿ã§ããã圢ã«é²åãããŸãããã
def start_end(func):
    def wrapper(*args, **kwargs):
        print("start")
        result = func(*args, **kwargs)
        print("end")
        return result
    return wrapper@start_end
def print_text(text):
    return text + "!"x = print_text("ããã¯ãããã§ã")
print(x)
ãã€ã³ãã¯3ã€ã§ãã*args, **kwargs ã§ã©ããªåŒæ°ãåãåããããã«ããfunc(*args, **kwargs) ã§ãã®ãŸãŸå
ã®é¢æ°ã«æž¡ããæ»ãå€ã return ããããšã§åŒã³åºãå
ã«å±ããŸããããã§åŒæ°ã®æ°ãæ»ãå€ã®æç¡ã«é¢ããããã©ããªé¢æ°ã«ããã³ã¬ãŒã¿ãŒãé©çšã§ããæ±çšçã®å®æã§ãð
ãã³ã¬ãŒã¿ãŒã¯ã¯ããŒãžã£ã»ã¹ã³ãŒãã»é¢æ°ãªããžã§ã¯ããšãã£ãPythonã®æ ¹å¹¹æŠå¿µã絡ã奥深ãããŒããäœç³»çã«åŠã¹ãæžç±ãæå ã«ãããšãçè§£ã®æ·±ããæ®µéãã§ãâš
ãã³ã¬ãŒã¿ãŒãã¯ããŒãžã£ã®æ£ããæžãæ¹ãfunctools.wraps ã®äœ¿ãã©ãããªã©ãçŸå Žã§åœ¹ç«ã€ãã¹ããã©ã¯ãã£ã¹ã90é
ç®ã«åçž®ãããŠããŸãã
颿°ãªããžã§ã¯ãã»ã¹ã³ãŒãã»ã¯ããŒãžã£ãšãã£ããã³ã¬ãŒã¿ãŒã®åå°ãšãªãæŠå¿µãã培åºçã«è§£èª¬ãäžçŽãäžçŽè ãç®æãæ¹ã«ã¯å¿ èªã®1åã§ãã
Pythonã®åºæ¬æ§æãäœç³»çã«ç¶²çŸ ããã³ã¬ãŒã¿ãŒã®åºç€ããã¹ã颿°ã®æåãªã©ãè¿·ã£ããšãã«é Œããå®çªæžã§ãã
é·æéã®ã³ãŒãã£ã³ã°ã§ãç²ãã«ããããŒããŒãããããšãåçµåŠç¿ã®ç¶ç¶åã倧ããå€ãããŸãã
ã³ãŒããšå ¬åŒããã¥ã¡ã³ãã䞊ã¹ãŠèŠããããã¥ã¢ã«ãã£ã¹ãã¬ã€ã¯ããã³ã¬ãŒã¿ãŒã®ãããªè€éãªããŒããåŠã¶éã®åŒ·åãªå³æ¹ã«ãªããŸãã
A. ã¯ããã§ããŸãã@deco1 ãš @deco2 ã颿°ã®äžã«äžŠã¹ãŠæžããšãäžã«æžãããã®ããé ã«é©çšãããŸããäŸãã° @deco1 / @deco2 / def func() ã®é ãªããdeco1(deco2(func)) ãšç䟡ã«ãªããŸãã
functools.wraps ã£ãŠäœïŒA. ãã³ã¬ãŒã¿ãŒãé©çšãããšãå
ã®é¢æ°ã®ååïŒ__name__ïŒãããã¥ã¡ã³ãæååïŒ__doc__ïŒã wrapper ã®ãã®ã«äžæžããããŠããŸããŸããfunctools.wraps ããã¹ã颿°ã®äžã«ãã³ã¬ãŒã¿ãŒãšããŠä»ãããšããããã®ã¡ã¿æ
å ±ãå
ã®é¢æ°ã®ãŸãŸä¿æã§ããŸããå®åã§ã¯å¿
ãã»ããã§äœ¿ãã®ãå®çªã§ãã
A. äœããŸãã@my_deco("hello") ã®ããã«åŒæ°ãæž¡ããã³ã¬ãŒã¿ãŒã¯ãããã³ã¬ãŒã¿ãŒãè¿ã颿°ããšããŠå®è£
ããŸããã3é建ãŠé¢æ°ãã«ãªãããå°ãè€éã§ããããã¬ãŒããªãã©ã€åŠçãªã©ã§ãã䜿ããã匷åãªãã¿ãŒã³ã§ãã
A. ã¯ããã¡ãœããã«ãåãããã«äœ¿ããŸããPythonæšæºã® @staticmethodã@classmethodã@property ãªã©ã¯ããŸãã«ã¡ãœããåãã®ãã³ã¬ãŒã¿ãŒã§ããèªäœã®ãã³ã¬ãŒã¿ãŒããã¡ãœããã®åŒæ° self 㯠*args ã®æåã®èŠçŽ ãšããŠèªç¶ã«åãåããŸãã
A. 颿°åŒã³åºãã1段éå¢ãããããå³å¯ã«ã¯ããããªãªãŒããŒãããã¯ãããŸãããã ãéåžžã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ç¡èŠã§ããã¬ãã«ã§ãã³ãŒãã®èŠéãã®è¯ããä¿å®æ§ã®ã¡ãªããã®æ¹ãã¯ããã«å€§ããã§ãã
ãã³ã¬ãŒã¿ãŒã®æ¬è³ªã¯ãã颿°ãåŒæ°ã«åããæ¹é ãã颿°ãè¿ã颿°ãã§ãã颿°ãªããžã§ã¯ãã»ãã¹ã颿°ã»ã¹ã³ãŒãã»å¯å€é·åŒæ°ãšãã4ã€ã®ããŒããæãã°ãèªåã§ãèªç±ã«äœããããã«ãªããŸãð
äžåºŠäœã£ããã³ã¬ãŒã¿ãŒã¯äœåã®é¢æ°ã«ã§ã䜿ãåããã®ã§ãã³ãŒãã®éè€ãåçã«æžããŸãããã°åºåã»èªèšŒãã§ãã¯ã»å®è¡æéèšæž¬ãªã©ããè€æ°ã®é¢æ°ã«å ±éããåŠçããèŠã€ããããããã¯çµ¶å¥œã®ãã³ã¬ãŒã¿ãŒåã®ãã£ã³ã¹ã§ãã仿¥åŠãã æžãæ¹ããã²ãšãã£ã¿ã§è©ŠããŠãPythonã³ãŒããã¯ã³ã©ã³ã¯äžã®ã¬ãã«ãžé²åãããŠã¿ãŠãã ããð
â ïž Windowsã»ãã¥ãªã…
ð§ çªç¶ã®æçš¿ã«ãã¡ã³éšç¶ïŒã©…
ð§© ããºã«ãè§£ãå¿«æãã³ãŒãã§…
âš ããã°ã©ã ã®åäœã軜ããã…
ð ãµãŒããŒãµã€ãéçºã®äžçãž…
âš é¢åãªWebäœæ¥ãèªååã…