Argparse: Как вызвать метод вместо функции?
Вопрос
Я использую argparse в моей программе Python, и я хочу позвонить метод Когда я запускаю свое программное обеспечение, как это:
$ 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»?
Решение
Вы просто ссылаетесь на метод вместо функции. Ага. Это так просто. Вместо
func = foo
Вы делаете
func = theobject.foo
Сделанный!
Другие советы
Вы дали правильный ответ сами. Просто поставить:
func = Your_Class.your_method
вместо:
func = foo
Вы ищете что-то вроде этого:
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'
Если по «методу» вы имеете в виду «метод экземпляра»: вы не можете вызвать метод экземпляра с примером, поэтому сначала понадобится экземпляр. Тогда вы можете просто обратиться к obj.method
и получить А. BoundMethod
который запоминает экземпляр (obj
) - Например:
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
.