アンダースコアで始まるプロパティを検査しても大丈夫ですか?
-
02-07-2019 - |
質問
私はパイロン用の非常にシンプルなクラッドジェネレータに取り組んできました。検査するものを思いつきました
SomeClass._sa_class_manager.mapper.c
これを検査する(またはアンダースコアで始まるメソッドを呼び出す)ことはできますか?クラス/オブジェクトの内部構造に大きく依存しているため、眉をひそめているものの、これは合法であると常に思っています。しかし、ちょっと、PythonにはJavaの意味でのインターフェースが実際にはないので、多分それは問題ありません。
解決
" private"が存在しないことが意図的です(Pythonで)。スコープ。アンダースコアで始まるものはすべて理想的には使用しないことが慣習であるため、その動作または定義が次のバージョンで変更されても文句を言わないかもしれません。
他のヒント
一般に、これは通常、メソッドが文書化されたインターフェイスの一部ではなく、事実上内部にあることを示しており、依存すべきではありません。ライブラリの将来のバージョンでは、このようなメソッドの名前を変更したり、削除したりできます。したがって、書き直さずに将来の互換性を気にする場合は、実行しないでください。
それが機能するのであれば、なぜですか?ただし、_sa_class_managerが再構築され、この特定のバージョンのSQLAlchemyにバインドされるか、変更を追跡するためにさらに作業を作成すると、問題が発生する可能性があります。 SQLAlchemyは動きの速いターゲットなので、もう1年であなたはそこにいるかもしれません。
望ましい方法は、目的のAPIをSQLAlchemy自体に統合することです。
既に述べた理由により、一般的には良い考えではありません。ただし、Pythonは、他に何かを行う方法がない場合に、この動作を意図的に許可しています。
たとえば、特定のオブジェクトの内部状態に直接アクセスする必要があると作者が考えていなかったクローズドソースのコンパイル済みPythonライブラリがある場合、実際にはそうすることができます—必要な情報。異なるバージョンに対応する前に同じ問題が発生します(幸運にもそれが維持されている場合)が、少なくとも実際にやりたいことができます。