TypeError를 호출하지 않고 잘못된 수의 인수로 Python 함수를 호출하는 방법이 있습니까?

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

  •  06-09-2019
  •  | 
  •  

문제

잘못된 수의 인수 또는 정의에 있지 않은 키워드 인수가있는 함수를 호출하면 TypeError가 나타납니다. 콜백을 사용하여 콜백이 지원하는 내용을 기반으로 변수 인수로 호출하는 코드를 원합니다. 그것을하는 한 가지 방법은 콜백을위한 것입니다. 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