2011-01-07 13 views
1

私はPythonプログラムに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

「メソッド」とは、「インスタンスメソッド」を意味します。インスタンスメソッドをインスタンスで呼び出すことはできません。インスタンスが必要です。次に、あなただけのobj.methodを参照し、インスタンス(objを)覚えてBoundMethod得ることができます - 例えば:

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 

それは静的だ場合は(もしそうなら、なぜ99%で自由な機能が簡単に使用でき、作業しています?同様に)またはクラスメソッド、ちょうどCls.methodを参照してください。

1

あなたは正しい答えをあなた自身がくれました。ただ置く:

func = Your_Class.your_method 

の代わり:利用

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() 

例:

func = foo 
+0

はい、「your_method」は静的メソッド(@staticmethod)でなければなりません。 –

1

あなたはこのような何かを探してい

$ python test.py foo 
'foo' 
$ python test.py bar 
'bar'