2011-04-06 2 views
3

자동으로 생성 된 메소드의 위치 및 기본 매개 변수를 제공해야합니다. 매개 변수 이름이나 기본값을 신경 쓰지 않으면 * args 및 ** kwargs 메서드를 사용하게됩니다. 여기에 내가 할 노력하고있어의 예입니다 (각 비 없음 값런타임에 생성 된 메소드의 매개 변수 이름 및 기본값 설정

def make_method(params): 
    # Create method that's parameters are defined in params. 
    return method 

params = {'param1': 'default_value', 'param2': None} 
method = make_method(params) 

나는 방법에 위치 인수를 만들려면 참고 각 없음 값 I는 기본 매개 변수를 만들려고합니다.

문제는 런타임시 매개 변수 이름과 기본값을 설정하는 방법을 모르겠다는 것입니다. 시그니처가 올바른 것이 낫기 때문에 메서드에 * args 및 ** kwars를 사용하고 싶지 않습니다. help() 등을 사용할 때 어떤 식 으로든 할 수 있습니까?

+1

와우 : 그것은 좋은 출발 :

def make_method(params): def impl(*args, **kwargs): # do stuff with args & kwargs print "I was called with {args} and {kwargs}".format( args=args, kwargs=kwargs) pass name = 'some_name' scope = dict(__impl=impl) exec """\ def {name}({pos_arg_defs}): 'Very helpful function.' return __impl({pos_arg_names}) """.format(name=name, pos_arg_defs=', '.join('='.join((k, repr(v))) for k, v in params.iteritems() if v is not None), pos_arg_names=', '.join(k for k, v in params.iteritems() if v is not None)) in scope return scope[name] 

이라면 나는 확실하지 않다,하지만 여기에 몇 가지 REPL 출력입니다. 왜 이렇게 **해야하는지 ** 모르겠지만 흥미로운 질문입니다. (나는 두려워합니다.) – Day

+0

오늘, 메서드 이름, 매개 변수, 매개 변수 기본값 및 메서드가 반환하는 사양을 포함하는 구성 파일에서 프로그램을 자동으로 작성하려고합니다. help() 함수가 더 도움이되고 사용자가 기본값을 사용할 수 있기를 원한다는 것을 제외하면 모든 것이 잘 작동합니다. – nihlaak

+0

인자를 생성 할 때 예측 가능한 순서로 반복 할 수 없으므로 params는 dict가 아니어야한다고 생각합니다. 아마도 arg 스펙을 가진 튜플 목록이 더 나은 디자인 일 것입니다. –

답변

1

이것은 해킹입니다! 또한 요청한 내용에 따라 kwargs를 생성하는 방법을 잘 모르겠습니다. s는 시작이다.

 
>>> help(make_method(dict(foo=42, bar=None, zomg='abc'))) 
Help on function some_name: 

some_name(zomg='abc', foo=42) 
    Very helpful function. 
관련 문제