ここから本文です

pythonのデコレータについてわからない部分があります。 def deco(func): def...

h4r********さん

2019/5/1923:23:38

pythonのデコレータについてわからない部分があります。

def deco(func):
def wrapper(x):
wx = "---" + x + "---"
return func(wx)
return wrapper

@deco
def printmsg(x):
print(x, "を入力し

ました。")

str = input("メッセージを入力してください。")

printmsg(str)

上記のコードになります。
printmsg()が実引数としてdecoに渡されているとのことなのですが、

printmsg = deco(printmsg)
print(deco)

という表記であっても理解できません。

wrapperのxにprintmsg(str)の「○○を入力しました」の「○○」の部分だけが渡されているのが主によくわかっていません。

defが二重になっていて、頭の整理ができていないのだと思いますが、引数について根本的に理解できていない可能性も高いです。わかりやすく説明してくださる方、いらっしゃいませんか。

閲覧数:
44
回答数:
2

違反報告

ベストアンサーに選ばれた回答

key********さん

2019/5/2009:27:53

△str = input("メッセージを入力してください。")
○s = input("メッセージを入力してください。")

strを変数名に使うと標準型のstrを隠してしまうので。


--

×printmsg()が実引数としてdecoに渡されているとのことなのですが、
○printmsgが実引数としてdecoに渡されているとのことなのですが、

--

×
printmsg = deco(printmsg)
print(deco)


printmsg = deco(printmsg)
print(printmsg(s))


--

理解が曖昧なままで質問文を書いているので、質問文に誤りが混じってしまっているように見えます。
質問する時はあなたが参照しているテキストを「誤りなく引用」することをお奨めします。
そうでないと、「テキストがそもそも間違っている」のか「あなたが正しく読めていない」のか、回答者からは区別がつきません。

上の方で×○で書きましたが「こういうことですよ」という意味と、「こう書いてありませんか」という意味の両方混じっています。どう答えればいいかわかりません。

本当に「str = input(〜」というコードを平気で書いてあったり、「printmsg()が実引数としてdecoに渡されている」と書いてあるのならそのテキストは参考にしない方がよろしいかと。

「printmsgが実引数としてdecoに渡されている」と書いてあるのを「printmsg()が実引数としてdecoに渡されている」と誤読してしまったのなら、その誤読が理解を妨げているのであり、「この2文の違いを知る」ことが理解への道です。

----

あとコードが読めなくなっているのも質問として不適切です。

質問した人からのコメント

2019/5/25 14:38:00

恥ずかしながら、関数と関数の呼び出しの区別もごちゃごちゃになっていました。
少し勉強してみて、だいぶ理解が進んだような気がしています。
先に回答を頂いた方をベストアンサーにさせていただきます。

ベストアンサー以外の回答

1〜1件/1件中

ikt********さん

2019/5/2018:51:03

質問文コードは???だし、出典も不明なんで、
推理(?)回答しかできませんが。

デコレータ の前に、
・関数

・関数の実行 (呼び出し といってもいいですけど)
の区別が、わかってないのでは? と思いました。
# 少なくとも 体感知 として、理解できてない。

Pythonという言語では、すべてがオブジェクト です。
数値 や 文字列 のように、コードから客体で扱う
データ だけじゃなく、関数そのもの も。

オブジェクトであるからには、
・代入文で 変数名 に束縛する
・他の関数に 引数 として関数を渡す
・引数として渡された関数を使う
ことも、可能です。

以下、Pythonインタプリタを起動し、
対話型におちゃらけで少し使ってみた
ターミナルの、コピペ です。

>>> def hello():
...     print('hello')
...
>>> hello()
hello
>>> hello
<function hello at 0x6ffffcceae8>
>>>
>>> bye = hello
>>> bye
<function hello at 0x6ffffcceae8>
>>> bye()
hello
>>>
>>> def run(any_func):
...     any_func()
...
>>> run(hello)
hello
>>> run(bye)
hello
>>>

hello は 関数オブジェクト を指す変数です。
それに かっこ () を付けると 関数の実行 です。
少なくとも、この違いが体感できてないと、
デコレータ(に限りませんが...)の解説記事
読んだところで、理解できないと思います。




以上、かんちがい なら、ごめんなさい。
無視して下さい。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる