2016-12-06 6 views
7

について構文は、なぜ私たちが開くようにopen("file")を使用しますが、それを閉じていない"file".close()のですか?
なぜそれが"file".open()または逆にclose("file")ですか?Pythonのオープン()対.close()

+1

スタイルのことです。オブジェクトで動作する関数は一般にそのオブジェクトのメソッドですが、最初にオブジェクトを生成する方法が必要です... –

+2

'' file ".open()' *私にとっては間違っているようです* 'str.open()'を有効にすると '' str.open() ''のように見えますが、すべての文字列は '' split() 'などとなります。 – Aurora0001

+1

' 'ファイル ''ではないので、 .open() 'は一致しません。私はそれが簡単に 'close(file_object)'だったと思います。 – user2357112

答えて

1

あなたより少し新しいことはありませんが、私はこれをやっていきます。基本的には、開閉はPythonのような言語ではかなり異なっています。ファイルを開くときには、ファイルを表すアプリケーション内で作業するオブジェクトを作成するので、ファイルが開かれたことをOSに知らせる関数で作成し、Pythonができるオブジェクトを作成しますファイルの読み書きに使用します。ファイルを閉じる時間が来たら、基本的に何が行われる必要があるのは、あなたのアプリケーションがOSにファイルを使って行われたことを伝え、そのファイルを表すオブジェクトをメモリから取り除くことです。これを行う最も簡単な方法は、オブジェクト自体のメソッド。また、"file".openのような構文では、ファイルを開くためのメソッドを文字列型に含める必要があります。これは非常に奇妙なデザインであり、その構文で実装したいものに対しては文字列型に多くの拡張が必要です。 close(file)はもっと意味をなさないでしょうが、そのオブジェクトを解放するための厄介な方法です/ OSにファイルが開かれていないことをOSに知らせ、ファイルを開いたときに作成したオブジェクトを表す変数fileを渡しますファイルのパスを指す文字列。

+1

私はあなたの説明にいくつかの訂正をしています: 'open'関数はあなたのファイルをメモリに読み込まない。 'read'と' readlines'はそれを行います。また、開いているファイルには必ずしも「ロック」されているとは限りません。オペレーティングシステムが開いているファイル参照をどのように処理するかによって異なります。私はあなたの意図を理解していますが、私は「ロック」という言葉を使わないでください。 – skrrgwasme

+0

ありがとうございます!私のMSのバックグラウンドはそこを通って見えていました。私はいくつかのOSがオープンファイルを処理する方法の違いを忘れていました。明確化を本当に感謝し、私は私の答えを更新しました。 –

8

open()は機能であり、.close()が対象メソッドです。 open()関数が実際には文字列"file"のクラスまたはインスタンスメソッドであることを意味するので、"file".open()は意味をなさない。すべての文字列が有効なファイルまたは開かれているデバイスではないので、インタープリタが"not a file-like device".open()をどのように処理するかはあいまいです。同じ理由で"file".close()を使用しません。

close("file")は、現在のプロセスが所有するファイルハンドルがそのファイルにアタッチされているかどうかを調べるためにファイル名のルックアップが必要です。それは非常に非効率的で、おそらくそれが信頼できないようにする潜在的な隠された落とし穴を持っているでしょう(例えば、ファイルではなくTTYデバイスであればどうでしょうか?)。開いているファイルやデバイスへの参照を保持し、その参照(ハンドルとも呼ばれます)を通してファイルを閉じるほうがはるかに高速で簡単です。

多くの言語では、このアプローチを取る:

f = open("file") # open a file and return a file object or handle 
# stuff... 
close(f)   # close the file, using the file handle or object as a reference 

これはあなたのclose("file")構文に似ていますが、だまされてはいけません:に保存されているとして、それは、それへの直接参照によってファイル名をファイルしないで閉じます文字列。

Python開発者は同じことをしましたが、代わりにオブジェクト指向のアプローチで実装していたため、異なって見えます。その理由の一部は、read(),、などのPythonファイルオブジェクトhave a lot of methodsです。close(f)を使用した場合、残りのファイルオブジェクトメソッドのすべてを次のように変更する必要があります。正当な理由がない限り、残りの関数とは異なる振る舞いをする1つのランダムな関数にすることができます。

TL; DR
open()file.close()の設計は、OOP主体と良好なファイル参照慣行と一致しています。open()は、ファイルやその他のデバイスを参照するオブジェクトを作成するファクトリのような関数です。オブジェクトが作成されると、そのオブジェクトに対する他のすべての操作は、クラスまたはインスタンスのメソッドによって行われます。

1

通常は、"file".close()を明示的に使用しないでください。コンテキストマネージャとしてopen(file)を使用して、例外が発生した場合にファイルハンドルも閉じます。問題の終了:

実際にあなたの質問に答えるためには、openは多くのオプションをサポートしており、返されるクラスはこれらのオプションによって異なります(io moduleも参照)。したがって、エンドユーザーがどのクラスを覚えているのかを正確に把握してから、適切なクラス自体に"class".openを使用するだけでは、はるかに複雑になります。また、 "ラップするファイルの整数ファイル記述子"を渡すこともできます。 openには、これはstr.open()メソッドを持っている以外にも、int.open()を取得することを意味します。これは本当に悪いのOO設計だけでなく、混乱するだろう。 StackOverflowでどのような質問が出るのかはわかりません("door".open()(1).open())...

しかし、私はpathlib.Path.openという機能があることを認めなければなりません。しかし、あなたが道を持っているなら、もはやあいまいではありません。

close()関数について:各インスタンスにはすでにclose()メソッドがあり、異なるクラス間に違いはないので、なぜ追加の関数を作成するのですか?単に利点がありません。

1

私が言ったことに加えて、fileタイプのビルドを削除したPythonの変更ログを引用します。 (Pythonの2で利用可能)fileタイプを使用して、クラスのコンストラクタのアプローチはPython 3で削除された理由は(簡単に)説明:

は、ファイルの種類を削除しました。 open()を使用します。 ioモジュールでオープンできるストリームには、いくつかの種類があります。

file("filename")fileのインスタンスを作成しながら、基本的には、open("filename")は、モードに応じて、異なるストリームクラスのインスタンスを返すことができます。

https://docs.python.org/3.4/whatsnew/3.0.html#builtins