'잘 동작하는'데코레이터와 함께 잘 작동하는 하드 코드 된 버전입니다. 함수 뒤에 선언해야합니다. 함수가 나중에 리바운드되면 나중에 변경 사항이 업데이트됩니다.
def get_name_doc():
# global function # this is optional but makes your intent a bit more clear.
return function.__name__, function.__doc__
이것은 기본 args가 작동하는 방식을 악용한다는 점에서 다소 불쾌한 해킹입니다. 이 함수가 초기화 될 때 바인딩 된 함수를 사용하고 함수가 리바운드 되더라도이를 기억합니다. args로 호출하면 흥미로운 결과로 이어질 것입니다.
def get_name_doc(fn=function):
return fn.__name__, fn.__doc__
여전히 하드 코딩되었지만 True 인수로 호출되는 함수에서 업데이트됩니다. 기본적으로이 버전은 그렇게 할 때만 업데이트됩니다.
def get_name_doc(update=False):
global fn
if update:
fn = function
return fn.__name__, fn.__doc__
물론 여기에도 데코레이터 예제가 있습니다.
@decorator # applying the decorator decorator to make it well behaved
def print_name_doc(fn, *args, **kwargs):
def inner(*args, **kwargs):
print(fn.__doc__, fn.__name__) # im assuming you just want to print in this case
return fn(*args, **kwargs)
return inner
데코레이터 데코레이터 (atleast)를 읽어야합니다. 하드 코드 된 것을 포함하는 NamedTuple 소스 (컬렉션 모듈에서)를보십시오. 슬프게도 명명 된 튜플 코드는 다소 이상합니다. 그것은 전통적인 형식보다는 eval과 함께 사용되는 문자열 형식입니다. 그러나 그것은 정말로 깔끔하게 작동합니다. 이것은 가장 유망한 변종 인 것 같습니다. 메타 클래스를 사용하여이 작업을 수행 할 수도 있지만 깔끔한 코드로 이어질 수 있지만 코딩해야 할 장면 뒤에 숨겨진 불쾌한 내용이 포함되어 있습니다. 이 ID는
에 대해 조언합니다. 모듈 끝 부분에 다음 줄을 추가하기 만하면 inspection/reflection/templates/metaclasess에 들어가기보다 쉬운 방법 일 가능성이 있습니다.
help(<module>)
여기서는 작업중인 모듈의 이름 (문자열)입니다. 또는 변수 __name__. 이것은 복수 모듈 또는 개별 클래스에서 작업하는 경우에도 __init__.py 파일에서 수행 할 수 있습니다. 라고 생각하면으로 생각됩니다.
그런 경우'올바른'문서 문자열을 얻을 수있는 방법이 있습니까? 문제 해결을위한 모든 작업이 필요합니까? – George
@ George, 아이디어를 얻으려면 내 게시물 하단을 참조하십시오. 나는 주변에서 해킹하는 것과 같은 것들로 놀았지만 생산 준비로 간주하는 수준에서 작동시키지 못했습니다. – aaronasterling
이 링크의'inspect.stack()'에 관해서 : http://stackoverflow.com/questions/900392/getting-the-caller-function-name-inside-another-function-in-python, 그는 어떻게 알 수 있습니까? 어떤 인덱스가 스택에 액세스합니까? 나는 그것이 추측이 맞지 않다고 생각한다. 어떤 stack [x] [y]를 접근 할 수 있는지 동적으로 파악할 수 있다면 관심이 있습니까? – George