2013-06-20 34 views
2

所以我在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__這樣的東西嗎?謝謝。

+0

一個很好的解決方案將使用可能的實現'decorators' –

回答

2

而不是使用這個的:

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

你可以使用更靈活的解決方案:

help_string = getattr(self, method).__doc__ 

只要確保你趕上AttributeError小號(當沒有給定名稱的方法時它會被拋出)。

+0

這工作:D謝謝。 –

+0

@FilipeKiss:真棒:)不客氣。如果你有更復雜的東西,考慮使用[argparse module](http://docs.python.org)[jterrace的建議](http://stackoverflow.com/a/17223209/548696)可能是個好主意/2.7/library/argparse.html?highlight=argparse#argparse)來構建CLI參數解析部分。但是,有時最好保持簡單;) – Tadeck

1

這將做到這一點:

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

我實際使用sys.argv中[2: ],因爲我從第二個元素中獲得了一切。我添加了這個來測試我忘記編輯的文檔。謝謝:) –

0

喜歡的東西

import inspect 

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

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

應該擴展得很好。

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