argparse: Cómo llamar a un método en lugar de una función?
Pregunta
Estoy utilizando argparse en mi programa de pitón y quiero llamar a un Método cuando corro mi software como este:
$ python __init__.py foo
Es fácil si quiero llamar a una función en lugar de un método:
def foo(args):
pass
def main():
foo_parser.set_defaults(func=foo)
if __name__ == "__main__":
main()
¿Cómo puedo reemplazar "func = foo" por "func = MyClass.my_method"?
Solución
sólo se refiere al método en lugar de la función. Sip. Es fácil. En lugar de
func = foo
hacer
func = theobject.foo
Listo!
Otros consejos
Se dio la respuesta correcta a sí mismo. Sólo hay que poner:
func = Your_Class.your_method
en lugar de:
func = foo
¿Usted está buscando algo como esto:
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()
ejemplo de uso:
$ python test.py foo
'foo'
$ python test.py bar
'bar'
Si por el "método" que quiere decir "método de instancia": No se puede llamar a un método de instancia con el ejemplo, por lo que necesita primero una instancia. Entonces, sólo puede referirse a obj.method
y obtener una BoundMethod
la que se acuerda la instancia (obj
) - por ejemplo:.
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
Si es una estática (si es así, ¿por qué? 99% en funciones libres son más fáciles de usar y funcionan igual de bien) o método de clase, sólo se refieren a Cls.method
.