2013-06-20 5 views
2

그래서 저는 파이썬에서 약간의 스크립트를 가지고 있으며 도움을 얻기 위해 각 메소드 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

'나는 실제로 sys.argv에 [2를 사용 –

답변

2

을 대신이를 사용하는 :

help_string = getattr(self, method).__doc__ 

그냥 당신이 AttributeError의를 잡을 수 있는지 확인하십시오

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

가 더 유연한 솔루션을 사용할 수 있습니다 (지정된 이름의 메소드가없는 경우는 슬로우됩니다). 꽤 잘 확장한다

import inspect 

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

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

같은

+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

을 decorators' : ] 왜냐하면 나는 두 번째 요소에서부터 모든 것을 얻는다. 나는 편집을 잊어 버린 문서를 테스트하기 위해 이것을 추가했다. 감사합니다 :) –

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 
관련 문제