>

다음과 같은 형식의 클래스 메소드가 있습니다 :

def _cool_method(arg1, arg2, **kwargs):
  <do pre-processing stuff>
  super()._cool_method(**flattened_kwargs)

내가 flattened_kwargs 를 원하는 곳   dict 가되기 위해  처럼 :

flattened_kwargs = {
    "arg1": value,
    "arg2" value,
    "kwargs_key1": value,
    "kwargs_key2": {"nestedarg1": value, "nestedarg2": value}
    "kwargs_key3": value,
}

단일 kwargs dict 를 전달해야합니다  하위 메소드에서 일부 처리 후 수퍼 호출에.

입력 서명을 단일 dict 로 병합하는 방법을 알아 냈습니다.   locals() 사용 :

attrs = locals().copy()
attrs.pop("kwargs")
attrs.update(kwargs)

이제 많은 자식 클래스 메소드를 호출하기 위해 이것을 헬퍼 함수로 변환하고 싶습니다. 그러나 위의 코드는 **kwargs 의 이름을 알고 있다고 가정합니다.  메소드 서명에 의해 정의 된대로. 가정 메소드 키를 pop() 에 하드 코딩 할 필요가 없도록 자식 메소드에서 이것을 검사하고 싶습니다.  전화.

Python 3.6에서는 검사 를 사용해야하며 이것을 멀리 얻을 수 있었다 :

def _get_signature_kwargs_key(f):
    keys = [k for k, v in signature(f).parameters.items() if v.kind == v.VAR_KEYWORD]
    return keys[0] if len(keys) == 1 else None

def flatten_signature_args(f, loc):
    kwargs_name = _get_signature_kwargs_key(f)
    attributes = loc.copy()
    # cater for method calls from classes, which include unwanted metadata
    for meta in ['__class__', 'self']:
        try:
            del attributes[meta]
        except KeyError:
            pass
    attributes.pop(kwargs_name)
    attributes.update(loc[kwargs_name])
    return attributes

명백한 이유로, VAR_KEYWORD 의 가정  독창성이 합리적으로 보입니다. 그러나 서명에서 이것을 추출하는 더 나은 접근 방법이 있습니까? 아니면 전체 서명을 병합하기위한 요구 사항에 대한 더 나은 접근 방법이 있습니까?

클래스 메소드를 호출 할 때 메타 키를 제거하기 위해 해킹을 수행해야하거나 self._cool_method 를 전달하면 실패합니다.  입력 기능으로.

  • 답변 # 1

    다음으로 해결 :

    def get_signature_locals(f, loc):]
        return {k: v for k, v in loc.items() if k in signature(f).parameters}
    def get_signature_kwargs_key(f):
        keys = [k for k, v in signature(f).parameters.items() if v.kind == v.VAR_KEYWORD]
        try:
            return keys.pop()
        except IndexError:
            return None
    def flatten_signature_kwargs(func, loc):
        kwargs_name = get_signature_kwargs_key(func)
        attributes = get_signature_locals(func, loc)
        if kwargs_name:
            attributes.pop(kwargs_name)
            attributes.update(loc[kwargs_name])
        return attributes
    
    

  • 이전 java - HashSet 동작은 놀랍습니다
  • 다음 html - 콘솔에서 복사 한 xpath에서 Google 스프레드 시트 importxml () 스크래핑이 작동하지 않습니다