2

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

~$ 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

4 回答 4

2

而不是使用这个:

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

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

help_string = getattr(self, method).__doc__

只要确保你抓住了AttributeErrors (当没有给定名称的方法时它会被抛出)。

于 2013-06-20T20:21:51.900 回答
1

这将做到:

method = sys.argv[2:3][0]  # This is a bit odd; why not sys.argv[2]?
print "Help: " + getattr(self, method).__doc__
于 2013-06-20T20:21:25.150 回答
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
于 2013-06-20T20:30:22.947 回答
0

就像是

import inspect

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

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

应该可以很好地扩展。

于 2013-06-20T20:24:20.053 回答