0

以下のコードで機能テストがどのように機能するかは、foo と bar で正しく機能します。

import argparse

class Myclass(object):

    def foo(self):
        print 'foo'

    def bar(self):
        print 'bar'

    def test(self,name,place):
        print name, place


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

2 に答える 2

0

test引数が必要です。への呼び出しに何も渡していないmain()ため、渡すものはありません__call__()

おそらく、次のようなものを に追加したいと思うでしょう__init__():

  parser.add_argument('arguments', nargs=argparse.REMAINDER)

その後main.args.arguments、動的呼び出しに戻します。

于 2013-05-06T14:25:06.470 に答える
0

私が得た解決策は以下の通りです:

def __init__(self):
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()

    for name in dir(self):
        if not name.startswith("_"):
            p = subparsers.add_parser(name)
            method = getattr(self, name)
            argnames = inspect.getargspec(method).args[1:]
            for argname in argnames:
                p.add_argument(argname)
            p.set_defaults(func=method, argnames=argnames)
    self.args = parser.parse_args()

def __call__(self):
    a = self.args
    callargs = [getattr(a, name) for name in a.argnames]
    return self.args.func(*callargs)
于 2013-06-28T22:09:13.030 に答える