动态访问实例方法

时间:2013-06-20 20:19:10

标签: python

所以我在python中有一个小脚本,为了帮助我想打印每个方法docstring。例如

~$ myscript.py help update

会将myClass.update.__doc__打印到屏幕上。我试图运行的代码是:

import sys


class myClass:

    def update(self):
        """ update method help """

    def help(self):
        method = sys.argv[2:3][0]

        if method == "update":
            print "Help: " + self.update.__doc__

myClass = myClass()
myClass.help()

它可以工作,但随着我的方法集合的增长,使帮助按计划进行工作会很麻烦。反正有动态调用类似self.method.__doc__的东西吗?感谢。

4 个答案:

答案 0 :(得分:2)

而不是使用它:

if method == 'update':
    help_string = self.update.__doc__

您可以使用更灵活的解决方案:

help_string = getattr(self, method).__doc__

请确保捕获AttributeError(当没有给定名称的方法时,它将被抛出)。

答案 1 :(得分:1)

这样做:

method = sys.argv[2:3][0]  # This is a bit odd; why not sys.argv[2]?
print "Help: " + getattr(self, method).__doc__

答案 2 :(得分:1)

我会使用argparse:

import argparse
import inspect

class myClass(object):
    """description for program"""

    def update(self):
        """update method help"""
        print 'update command'

    def something(self):
        """something command help"""
        print 'something command'

if __name__ == '__main__':
    program = myClass()
    parser = argparse.ArgumentParser(description=program.__doc__)
    subparsers = parser.add_subparsers()
    for name, method in inspect.getmembers(program, predicate=inspect.ismethod):
        subparser = subparsers.add_parser(name, help=method.__doc__)
        subparser.set_defaults(method=method)

    args = parser.parse_args()
    args.method()

命令行上的示例:

$ python ~/test/docargparse.py --help
usage: docargparse.py [-h] {something,update} ...

description for program

positional arguments:
  {something,update}
    something         something command help
    update            update method help

optional arguments:
  -h, --help          show this help message and exit

$ python ~/test/docargparse.py
usage: docargparse.py [-h] {something,update} ...
docargparse.py: error: too few arguments

$ python ~/test/docargparse.py update
update command

$ python ~/test/docargparse.py something
something command

答案 3 :(得分:0)

这样的东西
import inspect

class T:
    def test(self):
        '''test'''
        pass

for t in inspect.getmembers(T, predicate=inspect.ismethod):
    print t[1].__doc__

应该很好地扩展。