매우 가까운 관련이 있습니다 : How can I programmatically change the argspec of a function in a python decorator?어떻게 프로그래밍 방식으로 파이썬 장식 자에서 함수 *의 argspec을 변경할 수 있습니까?
데코레이터 모듈은 데코 레이팅 된 함수의 argspec를 보존하는 데코레이터 함수를 만드는 방법을 제공합니다.
데코레이터로 사용되지 않는 함수를 정의하면 다른 함수의 argspec를 복사 할 수 있습니까?
예 사용 사례 :
class Blah(object):
def foo(self, *args, **kwargs):
""" a docstr """
result = bar(*args, **kwargs)
result = result**2 # just so it's clear we're doing something extra here...
return result
def bar(x, y, z=1, q=2):
""" a more useful docstr, saying what x,y,z,q do """
return x+y*z+q
나는의 foo
'의 bar
처럼 argspec의'를하고 싶은,하지만, 소스 (즉, inspect.getsource(foo)
여전히 result
쓰레기를 보여줄 것) 변화가있을 수 있습니다. 이것의 주요 목적은 sphinx 문서와 ipython의 대화 형 도움말을 통해 적절한 인수를 표시하는 것입니다.
다른 질문에 대한 답변에서 말한대로 decorator package은이를 수행 할 수있는 방법을 보여 주지만 그 코드의 일부분에서는 길을 잃었습니다. decorator
패키지가 소스 등을 다시 컴파일하는 것 같습니다. 나는 더 간단한 접근을 기대했다. foo.argspec = bar.argspec
과 같은 것이 가능할 것입니다.
그래 그 일부 털이 소스입니다 :
여기 내가 사용하는 장식입니다 그 데코레이터 함수의 코드. 당신 말이 맞아요, 그 기능을 재건하고 있습니다 - 나는 FunctionMaker를 재사용하려고 제안하고 싶습니다. 클래스 메쏘드를 만들고 어떻게 가는지보십시오. – Hamish
원래의 서명을 개선하거나 적절한 docblock을 추가하는 것보다 더 많은 작업이 필요할 것으로 생각됩니다. – Hamish
'foo'는 실제로 메소드입니다. 그래서'foo'가'staticmethod'가되기를 원하지 않는다면, 첫번째 인자는 항상 인스턴스화 된 객체가 될 것입니다. 그렇지 않으면 'Blah.foo'에 대한 도움말을 확인하고 서명에서 첫 번째 인수로'self '를 보지 않는 것이 혼란 스러울 것입니다. 할 수 없다는 말은 아니며'bar' 시그니처에'self' 접두어를 붙이는 것을 기억해야 할 수도 있습니다. –