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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1970閲覧

with構文の__exit__()の中でインスタンスメソッドは呼び出せないのでしょうか?

mitsuru793

総合スコア157

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

1クリップ

投稿2015/06/15 06:48

pythonのwith構文には、withの開始と終了に実行される特殊メソッドがあることを知りました。それで下記のコードを実行したところ、exit()の中でインスタンスメソッドを実行するとそれ以降の処理が実行されません。組み込み関数や、クラス外で定義した関数は問題なく処理されます。

この理由がわかりません。どなたか教えていただけないでしょうか?
また、main()のtry文で例外が発生しているのですが、なぜ例外が発生してしまっているのかもわかりません。合わせてご教授いただけると大変助かります。

よろしくお願い致します。

実行環境
Mac OS X 10.9.5
Python 3.4.3

lang

1class withtest: 2 3 def __enter__(self): 4 print('__enter__') 5 return self 6 7 def __exit__(self, exc_type, exc_value, traceback): 8 print('__exit__') 9 print("self = %s" % self) 10 print("exc_type = %s" % exc_type) 11 print("exc_value = %s" % exc_value) 12 print("traceback = %s" % traceback) 13 14 outer_hello() 15 inner_hello() 16 print('exitを抜けます') 17 18 def close(self): 19 print('close') 20 21 def inner_hello(): 22 print('hello from inner') 23 24def outer_hello(): 25 print('hello from outer') 26 27def main(): 28 try: 29 with withtest() as w: 30 print(type(w)) 31 except: 32 print('例外発生') 33 34if __name__ == '__main__': 35 main() 36 37# => 38# __enter__ 39# <class '__main__.withtest'> 40# __exit__ 41# self = <__main__.withtest object at 0x1090f7a90> 42# exc_type = None 43# exc_value = None 44# traceback = None 45# hello from outer 46# 例外発生

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

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

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

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

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

guest

回答1

0

ベストアンサー

exit() 中の inner_hello の呼び出しを
self.inner_hello()
とし、
inner_hello() の定義を
def inner_hello(self):

としてはどうでしょうか。

投稿2015/06/15 10:26

yoshi777

総合スコア674

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

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

mitsuru793

2015/06/16 00:06

インスタンスメソッドなのでinner_hello()にself引数を記述していませんでした。ご指摘頂ありがとうございます。 インスタンスメソッド内で自分が持つメソッドを指定する場合は、self.メソッド名にしないといけないですよね。ただ、書かなくてもエラーが出ないのが不思議です。 また、selfをつけない場合でも、まずローカルから検索してくれるかと思っておりました。 ご回答頂き、どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問