هل هناك طريقة لاستدعاء وظيفة بيثون مع عدد خاطئ من الحجج دون استدعاء Typeerror؟

StackOverflow https://stackoverflow.com/questions/933484

  •  06-09-2019
  •  | 
  •  

سؤال

عند استدعاء وظيفة مع عدد خاطئ من الحجج، أو مع وسيطة الكلمة الرئيسية ليست في تعريفها، يمكنك الحصول على TypeEror. أود الحصول على قطعة من التعليمات البرمجية لاتخاذ رد اتصال واستدعاءها مع وسيطات متغيرة، بناء على ما يدعمه رد الاتصال. طريقة واحدة للقيام بذلك ستكون، للحصول على رد cb, ، استعمال cb.__code__.cb_argcount و cb.__code__.co_varnames, ، لكنني أفضل مجردة ذلك في شيء مثل apply, ، ولكن هذا ينطبق فقط الحجج التي "تناسب".

علي سبيل المثال:

 def foo(x,y,z):
   pass

 cleanvoke(foo, 1)         # should call foo(1, None, None)
 cleanvoke(foo, y=2)       # should call foo(None, 2, None)
 cleanvoke(foo, 1,2,3,4,5) # should call foo(1, 2, 3)
                           # etc.

هل هناك أي شيء مثل هذا بالفعل في بيثون، أم أنه شيء يجب أن أكتب من الصفر؟

هل كانت مفيدة؟

المحلول

بدلا من الحفر إلى تفاصيل نفسك، يمكنك فحص توقيع الوظيفة - ربما تريد inspect.getargspec(cb).

بالضبط كيف تريد استخدام هذه المعلومات، و ARGS لديك، لاستدعاء الوظيفة "بشكل صحيح"، ليست واضحة تماما بالنسبة لي. على افتراض أن البساطة التي تهتم بها فقط بسيطة تسمى Args، والقيم التي ترغب في تمريرها هي في Dict d...

args = inspect.getargspec(cb)[0]
cb( **dict((a,d.get(a)) for a in args) )

ربما تريد شيئا فانتيير، ويمكن أن توضح بالضبط ماذا؟

نصائح أخرى

هذا ممكن؟

def fnVariableArgLength(*args, **kwargs):
    """
    - args is a list of non keywords arguments
    - kwargs is a dict of keywords arguments (keyword, arg) pairs
    """
    print args, kwargs


fnVariableArgLength() # () {}
fnVariableArgLength(1, 2, 3) # (1, 2, 3) {}
fnVariableArgLength(foo='bar') # () {'foo': 'bar'}
fnVariableArgLength(1, 2, 3, foo='bar') # (1, 2, 3) {'foo': 'bar'}

يحرر حالات استخدام الخاص بك

def foo(*args,*kw):
    x= kw.get('x',None if len(args) < 1 else args[0])
    y= kw.get('y',None if len(args) < 2 else args[1])
    z= kw.get('z',None if len(args) < 3 else args[2])
    # the rest of foo

foo(1)         # should call foo(1, None, None)
foo(y=2)       # should call foo(None, 2, None)
foo(1,2,3,4,5) # should call foo(1, 2, 3)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top