2

Pythonでは、dir()関数を使用して、渡された引数の属性、クラス、メソッドのリストを表示します。

たとえばemail、Pythonにはモジュールがあります

import email
dir(email)

結果:

['Charset', 'Encoders', 'Errors', 'FeedParser', 'Generator', 'Header', 'Iterators', 'LazyImporter', 'MIMEAudio', 'MIMEBase', 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', 'MIMENonMultipart', 'MIMEText', 'Message', 'Parser', 'Utils', '_LOWERNAMES', '_MIMENAMES', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_name', 'base64MIME', 'email', 'importer', 'message_from_file', 'message_from_string', 'mime', 'quopriMIME', 'sys']

したがって、私が知りたいのは、上記のリスト内の特定のオブジェクトが属性、メソッド、クラス、または関数であるかどうかを判断する方法です。

上記のリストから、、、などが属性であることが期待できますが、リストを見るだけで、これらのタイプのすべて/残りをどのように区別できます__all__か?__builtins____doc__

4

3 に答える 3

4

それらはすべて属性であり、それらの属性の一部は、関数、一部のクラス、またはオブジェクトを参照する場合があります。のようなもの__this__は一般的に魔法のメソッドと呼ばれています。

あなたは見ることができます:

[type(getattr(email, x)) for x in dir(email)]

しかし、最良の答えは、「私は何を気にするのか」です。

インターフェイスについて知っておく必要のある情報は、モジュールのドキュメントに記載されています。さまざまな属性のタイプはほとんど役に立たず、重要性は低くなります(また、dir不完全になる可能性もあります)。

したがって、タイプチェックを気にしないでください。ただし、Pythonの命名規則を知って(そして使用して)価値があります(pep8を参照)。

  • CamelCaseクラスの場合
  • snake_case関数とメソッドの場合
  • SHOUTY_CASE定数の場合
  • _leading「プライベート」なものにアンダースコアを付ける(つまり、文書化されていない、実装の詳細、パブリックインターフェイスの一部となることを意図していない)
  • __double名前マングリングを有効にするための主要なアンダースコアは、複雑な継承状況で発生する可能性のある名前空間の衝突を処理する方法です(通常の使用ではほとんど確実に必要とされない非常にあいまいな機能)
  • __dunder__ "double underscore" things for magic methods as mentioned previously, these are datamodel hooks for Python itself. You can redefine existing hooks to customize behaviour in your classes and modules, but don't invent new magic names just for your own purposes, use normal attributes instead.
于 2012-12-07T06:06:15.890 に答える
0

「リストを見ただけでは」できません。それらはすべて属性です。それらの中には、メソッド、関数、クラスなどもあるかもしれませんが、リストを見てもわかりません。実際のオブジェクトを確認する必要があります。たとえば、を使用して、が呼び出し可能callable(email.Encoders)かどうかを判断できます。email.Encodersあなたはtype(email.Encoders)それがどんなタイプであるかを知るために使うことができます。または、使用する必要のあるメソッド/クラス/関数がわかっていて、まったく使用せずに使用しているため、これらのいずれも実行しない可能性がありますdir

コードで実際に何を達成しようとしていますか?

于 2012-12-07T06:04:47.650 に答える
0

Is this what you're looking for?

[type(getattr(email, x)) for x in dir(email)]

于 2012-12-07T06:06:51.943 に答える