私は何人かの人には比較的愚かなものを探していましたが、私にとってはとても興味深いものでした。 :-)OSError例外クラスのサブクラスのインスタンスを返すロジックはどこですか?
Python 3.3では入力エラーと出力エラーがOSError
とマージされているため、例外クラス階層が変更されています。組み込みクラスOSError
についての興味深い機能を使用すると、のサブクラスであるOSError
リターンFileNotFoundError
インスタンスのコンストラクタにerrno
とstrerror
を渡して見ることができるようにerrno
と
>>> OSError(2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')
>>> OSError(2, os.strerror(2)).errno
2
>>> OSError(2, os.strerror(2)).strerror
'No such file or directory'
strerror
を通過したとき、それはそれのサブクラスを返す、ということですOSError
。
パイソンDOC:OS以下exceptionsに記載されるように
コンストラクタは、多くの場合、実際に、OSErrorのサブクラスを返します。特定のサブクラスは最終的なerrno値に依存する。 この現象は、OSErrorを直接またはエイリアス経由で構築する場合にのみ発生し、サブクラス化する際に継承されません。
このように動作するサブクラスをコーディングしたかったのです。ほとんどの場合好奇心であり、実際のコードではありません。私はまた、サブクラスオブジェクトを作成するロジックはどこですか、それは例えば__new__
でコードされていることを知りたいですか?
>>> class A(OSError): pass
>>> A(2, os.strerror(2))
A(2, 'No such file or directory')
その後、型チェックがなければならない:__new__
は、サブクラスのインスタンスを作成するためのロジックが含まれている場合__new__
で型チェックのいくつかの並べ替えがあるかどういない限り、OSError
から継承することは一般的に、この動作を返します
# If passed OSError, returns subclass instance
>>> A.__new__(OSError, 2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')
# Not OSError? Return instance of A
>>> A.__new__(A, 2, os.strerror(2)
A(2, 'No such file or directory')
私はこのコードがどこに配置されているかを知るためにCコードを掘り下げています。私はC言語の専門家ではないので、これは本当にロジックだと思っています率直でなければならない):
あなたはなぜあなたは私に言わせればOSErro
は、ユーザーが定義したクラスのインスタンスを作ることができるように、今私は、Cのコードで遊んなしのPython自体から
errnomap
の拡大の可能性について思ったんだけど
if (myerrno && PyLong_Check(myerrno) &&
errnomap && (PyObject *) type == PyExc_OSError) {
PyObject *newtype;
newtype = PyDict_GetItem(errnomap, myerrno);
if (newtype) {
assert(PyType_Check(newtype));
type = (PyTypeObject *) newtype;
}
else if (PyErr_Occurred())
goto error;
}
}
それ?私は、ただ楽しむために言っています。
'OSError .__ new__'をmonkeypatchする必要がありますが、組み込み/拡張型の属性は設定できません。基本的にOSErrorをサブクラス化してそこにモンキーを入れなければならないが、それはあなたが望むものではないと思う。要約すると、ユーザー定義クラスでそれをやっていますか?それほど難しくない。それを組み込みの上でやっています - そう簡単ではありません。 –
また、質問を言い換えると、_ OSError例外クラスのサブクラスのインスタンスを返すロジックがありますか?それはすでに見つかりました。ビルトインでそれをすることは重要ですか?または、ユーザー定義のクラスでそれを行う一般的な概念はうまくいくでしょうか? –
@ŁukaszRogalski私はおそらくタイトルを変更する必要がありますが、私は今どのように質問をしているのかは分かりません。 – direprobs