在Python中,dir()
函数用于显示传递给它的参数的属性,类,方法,对吧?
例如,python中有一个模块email
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__
等是属性,但我们如何通过查看来区分这些类型的所有/剩余清单?
答案 0 :(得分:4)
它们是所有属性,其中一些属性可能引用函数,某些类或对象。像__this__
这样的人是magic methods。
你可以看一下:
[type(getattr(email, x)) for x in dir(email)]
但最好的答案是:“我在乎什么?”
您需要了解有关该接口的任何信息,请参阅该模块的文档。各种属性的类型用处不大,重要性低(dir
也不完整)。
所以不要打扰类型检查。值得了解(并使用)python命名约定(参见pep8):
CamelCase
用于课程lower_with_underscores
了解功能和方法SHOUTY_CASE
for constants _leading
强调“受保护”的内容(即不打算成为公共界面的一部分)__double
强调“私人”事物的下划线(类似于上面的内容,但名称更糟)__underline__
如前所述的魔术方法答案 1 :(得分:0)
你不能,而不是“仅通过查看列表”。所有这些都是属性。其中一些也可能是方法,函数或类等,但您无法通过查看列表来判断。你必须看看实际的对象。例如,您可以使用callable(email.Encoders)
来确定email.Encoders
是否可调用。您可以使用type(email.Encoders)
找出它是什么类型。或者,更有可能的是,您不会执行这些操作,因为您知道需要使用哪些方法/类/函数,并且在不使用dir
的情况下使用它们。
您实际上想用代码完成什么?
答案 2 :(得分:0)
这是你要找的吗?
[type(getattr(email, x)) for x in dir(email)]