teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記1

2018/09/13 06:02

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -37,4 +37,70 @@
37
37
 
38
38
  なので、次のステップ ( forの外側なり, 次のiの状態に... ) に行く前までにcloseしておく。
39
39
 
40
- そうすれば多少はマシになると思います。
40
+ そうすれば多少はマシになると思います。
41
+
42
+ ---
43
+ [追記1]
44
+
45
+ もっとスマートに...ですか。
46
+ うーん、仕様なので最終的には open -> 何らかの処理 -> close っていうのは必ずだと思いますが、
47
+ 視覚的にわかりやすく...っていうのなら、関数化 ( メソッド化 ) するかクラス化するか。じゃないかなと。
48
+
49
+ 例えば、C++ではデストラクタっていう、コンストラクタの反対の特殊なメソッドがあるので、
50
+
51
+ コンストラクタで openしておいて、デストラクタでclose。execメソッドとかみたいな独自のメソッドで何らかの処理...みたいにするクラスを定義してそれを使うとか。
52
+
53
+ で、検索してみるとPythonにもデストラクタは存在するみたいですが、「いつ起動するかわからん」らしく、あまり使われない様子。
54
+
55
+ 根拠:[Python基礎講座(13 クラス)](https://qiita.com/Usek/items/a206b8e49c02f756d636)
56
+
57
+ ということなのでこれは論外。
58
+
59
+ で、もうちょっと考えてみると、デザインパターンのTemplateMethodパターンが使えそう。
60
+
61
+ 親クラスとして
62
+
63
+ openをしておくメソッド, closeをするメソッド, 実際の処理をするメソッド は 子クラスで定義するようにしておいて、execメソッドなるメソッドに流れを記述。そのクラスを継承してopenしておく...とかのメソッドを定義。
64
+ そうすれば execメソッドを呼び出せばいいだけ。
65
+
66
+ できれば純粋仮想とかがいいかもしれないけど、私はpythonはやっていないので詳しくない。なので普通のクラスとしてやると、
67
+
68
+ ```Python
69
+ # あくまでイメージとして。
70
+ class TestParent:
71
+ def open( filename ):
72
+ # ダミー
73
+ def close():
74
+ # ダミー
75
+ def Main():
76
+ # ダミー
77
+ def exec( filename ):
78
+ if open( filename ):
79
+ Main()
80
+ close()
81
+
82
+ class TestChild(TestParent):
83
+ def open( filename ):
84
+ # ここでファイルを開く
85
+ def close():
86
+ # ここでファイルを閉じる
87
+ def Main():
88
+ # ここで実際に行いたい処理 ( 例えばファイルのデータを読み取って計算して返すとか )
89
+
90
+ # 呼び出し元にて
91
+ file = TestChild()
92
+ file.exec( ファイルパス ) # execメソッドを呼び出すだけ。
93
+ ```
94
+ のような状態。
95
+
96
+ そうすれば質問で言えば
97
+
98
+ ```Python
99
+ file = TestChild();
100
+ for image in path:
101
+ file.exec( image )
102
+ ```
103
+
104
+ みたいな感じでできる。もちろん戻り値とかも必要だけど。
105
+
106
+ でも最終的にはcloseしたりするから対して変わらん ( 行数が長くなるが ) ので、スマートと言えるかどうかわかりませんが。