Python, 列出参数的属性

Python, listing the attributes of a parameter

这题可能有点绿

在下面的示例中,我试图从 "message" 参数中找出属性列表。

@respond_to("^meow")
def remind_me_at(self, message):
    fre = "asd: %s " % str(message.sender)
    fre = "asd: %s " % str(message.mention_name)
    fren = "asd: %s " % str(message.sender.name)
    #fren = "hello, %s!" % str(message)
    self.say(fren, message=message)
    self.say(fre, message=message)

由于没有文档,但代码是开源的,如何找到有效实现该方法的文件;即使 class 在库文件中。

[[更新]] 我在另一个以不同方式提出问题的线程上找到了这个解决方案

[(name,type(getattr(math,name))) for name in dir(math)]

使用dir()内置函数。它 returns 对象所有属性的列表。

print dir(message)

目录

dir([object]) -> list of strings

If called without an argument, return the names in the current scope.
Else, return an alphabetized list of names comprising (some of) the 
attributes of the given object, and of attributes reachable from it.
If the object supplies a method named __dir__, it will be used; 
otherwise the default dir() logic is used and returns:

for a module object: the module's attributes.
for a class object:  its attributes, and recursively the attributes
  of its bases.
for any other object: its attributes, its class's attributes, and
  recursively the attributes of its class's base classes.

请定义一个名为 TestClass 的演示 class,如下所示。

>>> class TestClass(object):
...     def abc(self):
...         print('Hello ABC !')
...
...     def xyz(self):
...         print('Hello xyz !')
...
>>> dir(TestClass)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'abc', 'xyz']

getattr

getattr(object, name[, default]) -> value

Get a named attribute from an object;

getattr 可以从 TestClass:

得到一个属性
>>> getattr(TestClass, 'abc')
<unbound method TestClass.abc>

>>> getattr(TestClass, 'xxx', 'Invalid-attr')
'Invalid-attr'

hasattr

hasattr(object, name) -> bool

Return whether the object has an attribute with the given name.

演示:

>>> hasattr(TestClass, 'abc')
True
>>> hasattr(TestClass, 'xxx')
False

如果没有什么可以帮助到你,请把你的想法说清楚。

如 Rob 所述,dir 命令能够列出属性。这在您尝试调试 运行 代码时非常方便。

如果您可以与代码进行交互式会话(您知道,只是 运行 ol' REPL 解释器)然后尝试:

>>> help(message)

如果该库的开发人员是一个体面的人,那么希望他们已经编写了一个有价值的文档字符串,可以为您提供有关该对象的一些上下文。

另一个方便的工具是 __file__ 属性,但这只适用于模块。 因此,如果您知道要获取 message 的导入名称,您可以这样做:

>>> import some_module   # `message` comes from this module
>>> some_module.__file__
/usr/lib/python/python35/lib/site-packages/some_module/__init__.py

一旦你知道了目录,就开始搜索 message 的来源:

$ cd /usr/lib/python/python35/lib/site-packages/some_module
$ grep -r message *