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

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

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

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

Q&A

解決済

1回答

1047閲覧

ファイル以外で使用する「with」構文について

study_111

総合スコア82

Python

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

0グッド

0クリップ

投稿2020/06/12 16:15

with構文について、分からない部分があります。
Qiitaの、以下のコードなのですが、ファイルを開いている訳ではないにも関わらず、何故with構文が使用できるのでしょうか。

import socket import ssl import OpenSSL def get_server_certificate(hostname): context = ssl.create_default_context() with socket.create_connection((hostname, 443)) as sock: with context.wrap_socket(sock, server_hostname=hostname) as sslsock: der_cert = sslsock.getpeercert(True) return ssl.DER_cert_to_PEM_cert(der_cert) cert = get_server_certificate('www.google.com') x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)

withについて調べてもファイルに関連する説明記事が多く、それ以外はあまり見当たりませんでした。
with構文について、ご助言頂けましたら、幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

__enter__メソッドと __exit__メソッドを持っているオブジェクトであれば with 文が使えます。
参考: https://docs.python.org/ja/3/reference/compound_stmts.html#the-with-statement

サンプルプログラム

python

1class Sample: 2 3 def __enter__(self): 4 print("with start") 5 return self 6 7 def __exit__(self, *args): 8 print("with end") 9 10 def hello(self): 11 print("Hello, world!") 12 13 14with Sample() as s: 15 s.hello()

実行結果:

text

1with start 2Hello, world! 3with end

実行内容的には、以下を実行したことになります。
with文は、以下の内容を実行するためのシンタックスシュガー(糖衣構文)ということになります。

py

1s = Sample() 2exit_object = s.__enter__() 3try: 4 s.hello() 5finally: 6 exit_object.__exit__()

投稿2020/06/12 16:22

編集2020/06/12 22:52
shiracamus

総合スコア5406

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

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

study_111

2020/06/12 16:46

ご回答ありがとうございます。 重ね重ねの質問で恐縮なのですが、2点程、お聞きしたいことがございます。 「with Sample() as s:」ここの部分では、Sampleクラスのインスタンスが「s」だと思うのですが、どのような形でインスタンス「s」が作成されているのでしょうか? また、with構文は必ず、「__enter__」メソッドが呼ばれ、その後with構文の中の処理を実行し、最後は「 __exit__」が呼ばれるという流れと決まっているのでしょうか...?
shiracamus

2020/06/12 22:53 編集

実行内容を回答欄に追記しました。 with文を使うことで、前処理(__enter__) と 後処理(__exit__) を確実に呼び出してくれます。 例外が発生して異常終了する場合にも __exit__ を呼び出してくれます。
study_111

2020/06/12 23:01 編集

ご丁寧に、追記頂きまして、ありがとうございます。 処理の流れが分からなかったのですが、おかげで理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問