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
.