2011-01-07 6 views
1

내 파이썬 프로그램에 argparse 사용하고 그리고 내가 이런 내 소프트웨어를 실행할 때 방법를 호출 할 : 내가 대신 방법의 함수를 호출 할 경우argparse : 함수 대신 메서드를 호출하는 방법?

$ python __init__.py foo 

쉽게입니다 :

def foo(args): 
    pass 

def main(): 
    foo_parser.set_defaults(func=foo) 

if __name__ == "__main__": 
    main() 

어떻게 "func = foo"를 "func = MyClass.my_method"로 바꿀 수 있습니까?

답변

5

함수 대신 함수를 참조하십시오. 예. 그것은 쉽습니다. 대신

func = foo 

의 당신은

func = theobject.foo 

완료 할!

+1

그래, 맞아! 내 질문이 멍청하기 때문에 미안해. 문제는 거기에 없었다. 인스턴스를 선언하는 대신 @staticmethod를 사용합니다. 고맙습니다 :-) –

+0

'theobject'를 생성하기위한 주 파서 옵션이 필요한 경우 어떻게합니까? – zhigang

+0

해결 방법 얻기 : args.func .__ call __ (theobject, args). 더 나은 해결책이 있습니까? – zhigang

0

"방법"으로 "인스턴스 방법"을 의미하는 경우 : 인스턴스와 함께 인스턴스 메서드를 호출 할 수 없으므로 먼저 인스턴스가 필요합니다. ?이 그렇다면, 왜 99 %의 무료 기능을 사용하기 간단하고 작업 (정적을의 경우

class Cls: 
    def __init__(self, x): 
     self.x = x 
    def foo(self, new_x): 
     self.x = new_x 

obj = Cls(1) 
foo = obj.foo 
foo(2) # same as obj.foo(), but we don't need to keep obj for this! 
print(obj.x) #=>2 

: 예 - 그럼, 당신은 단지 obj.method를 참조 인스턴스 (obj)를 기억 BoundMethod를 얻을 수 있습니다 그냥) 또는 클래스 메서드, 그냥 Cls.method 참조하십시오.

1

당신은 정답을 직접 제공했습니다. 그냥 넣어 :

func = Your_Class.your_method 

대신 :

func = foo 
+0

예, "your_method"는 정적 메소드 (@staticmethod) 여야합니다. –

1

는이 같은 뭔가를 찾고있다 : 사용의

import argparse 

class Myclass(object): 

    def foo(self): 
     print 'foo' 

    def bar(self): 
     print 'bar' 

class Main(Myclass): 

    def __init__(self): 
     foo_parser = argparse.ArgumentParser() 

     foo_parser.add_argument('method') 
     self.args = foo_parser.parse_args() 

    def __call__(self, *args, **kws): 
     method = self.args.method 
     return getattr(self, method)(*args, **kws) 

if __name__ == "__main__": 
    main = Main() 

    main() 

예 :

$ python test.py foo 
'foo' 
$ python test.py bar 
'bar' 
관련 문제