【问题标题】:Getting a concise version of dir()获取 dir() 的简洁版本
【发布时间】:2021-06-21 14:20:08
【问题描述】:

我想找到一种通用的方式来列出 python 对象的属性(名称和值),但要简洁。 这在使用vars() 时效果很好,但是如果没有__dict__,则不能使用它;而dir() 充满了无趣的属性。

我知道这有点随机,但 PyCharm 正在以某种方式做类似的事情,这是 numpy ndarray 对象的示例,它没有 __dict__dir() 包含 161 个属性。我试图从dir() 中删除私有和可调用值,但仍然有几十个。

知道 PyCharm 是如何做到的吗?例如,他们是否有可能对numpy 对象进行特殊处理?

【问题讨论】:

  • “无趣”的属性集很大,但可以预测。如果它们只是被明确过滤,我不会感到惊讶。
  • 感谢您的评论,您是否知道我在哪里或如何找到这些可预测值列表的来源或想法? @chepner
  • 我不认为它已发布,但您可以通过查看 dir(x) 来构建一个有用的列表,其中包含许多不同类型的 x 值。 (不过,其中大部分是 CPython 实现细节。如果您可以将 PyCharm 设置为使用 pypy 之类的东西,看看会发生什么变化,看看会发生什么,这会很有趣。)
  • 我敢打赌 PyCharm 有专门的代码来显示 numpy 数组、pandas 系列等,因为这些是流行的库,而不是使用通用对象解码器。

标签: python


【解决方案1】:

对于在 Python 中定义的类,您可以在对象上使用 __dict__(如果有)加上在其类型(如果有)上使用 __slots__。对于 CPython 中的 内置 类型,您可能还想在类的字典中搜索 types.GetSetDescriptorTypetypes.MemberDescriptorType 和/或 types.DynamicClassAttribute 类型的对象。这会遗漏大多数具有__names__ 的内容,尽管过滤剩余的内容仍然很有用。

【讨论】:

  • 现在好多了,但还有很多其他项目。谢谢你的回答!
  • @GalShahar:什么“其他项目”?如果没有特定类型的规则,我不确定是否可以比上述做得更好,但如果你举个例子,我们可以找到。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2011-08-07
  • 2022-01-21
  • 2021-07-30
  • 2013-05-28
  • 2015-02-21
  • 2014-05-22
相关资源
最近更新 更多