argparse: come chiamare un metodo, invece di una funzione?
Domanda
Sto usando argparse nel mio programma Python e voglio chiamare un metodo quando eseguo il mio software come questo:
$ python __init__.py foo
E 'facile se voglio chiamare una funzione invece di un metodo:
def foo(args):
pass
def main():
foo_parser.set_defaults(func=foo)
if __name__ == "__main__":
main()
Come posso sostituire "func = foo" con "func = MyClass.my_method"?
Soluzione
Basta fare riferimento al metodo anziché la funzione. Sì. E 'così facile. Invece di
func = foo
fare
func = theobject.foo
Fatto!
Altri suggerimenti
ha dato la risposta corretta da soli. Basta mettere:
func = Your_Class.your_method
invece che:
func = foo
Sei alla ricerca di qualcosa di simile a questo:
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()
esempio di utilizzo:
$ python test.py foo
'foo'
$ python test.py bar
'bar'
Se per "metodo" si intende "metodo di istanza": Non è possibile chiamare un metodo di istanza con esempio, quindi è necessario prima un'istanza. Quindi, si può solo fare riferimento a obj.method
e ottenere un BoundMethod
, che ricorda l'istanza (obj
) - per esempio:.
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
Se è uno statico (se sì, perché? Nel 99% funzioni liberi sono più semplici da utilizzare e lavorare altrettanto bene) o metodo di una classe, basta fare riferimento a Cls.method
.