2017-03-24 1 views

답변

1

이 문제 중 하나는 파이썬의 함수가 1 급 개체라는 것입니다. 따라서 그들의 이름을 재 지정할 수 있습니다. 예를 들어 :

def myfunc(): 
    pass 

a = myfunc 
myfunc = 42 

a() 

우리는 또한 폐쇄 함수가 다른 함수에 의해 반환하고 원래 이름이 범위를 벗어나있다을 보유하고 있습니다.

불행히도 기존 이름과 같은 이름의 함수를 정의하는 것은 매우 합법적입니다. 예를 들어 : - id 재사용 얻을 수 있기 때문에 즉, 폐쇄에 도움이되지 않습니다하지만

def myfunc():  # <<< This code is never called 
    pass 

def myfunc(): 
    pass 

myfunc() 

그래서 어떤 추적 기능의 id, 단지 이름을 포함해야합니다. 함수의 __name__ 속성을 다시 할당해도 도움이되지 않습니다.

데코레이터를 사용하여 함수 호출을 추적 할 수 있습니다. 여기에 나는 이름과 id을 사용했습니다. id은 독자적으로 읽을 수 없습니다.

{'myfunc1 (4339565296)': 2, 'myfunc1 (4339565704)': 1} 

을하지만에만 호출 된 기능을하지하지 않은 자들을 제공합니다

import functools 
globalDict = {} 

def tracecall(f): 

    @functools.wraps(f) 
    def wrapper(*args, **kwargs): 
     global globalDict 
     key = "%s (%d)" % (f.__name__, id(f)) 

     # Count the number of calls 
     if key in globalDict: 
      globalDict[key] += 1 
     else: 
      globalDict[key] = 1 
     return f(*args, **kwargs) 

    return wrapper 


@tracecall 
def myfunc1(): 
    pass 

myfunc1() 
myfunc1() 

@tracecall 
def myfunc1(): 
    pass 

a = myfunc1 
myfunc1 = 42 

a() 

print(globalDict) 

을 제공합니다!

여기에서 어디로 가야합니까? 파이썬의 역동적 인 특성을 감안할 때 작업이 매우 어렵다는 것을 알기를 바랍니다. 그러나 위의 데코레이터가 최소한 코드가 사용되는 방식을 진단 할 수 있기를 바랍니다.

0

없음을 것을 감지하지 않으며 문제가되지 않습니다. 파이썬은 이것을 감지하지 못합니다. 실행 중에 어떤 함수가 호출되는지 여부를 감지하려면 프로그램에서 전역 집합을 사용할 수 있습니다. 각 함수 안에는 설정할 함수 이름을 추가하십시오. 나중에 설정 한 내용을 인쇄하여 해당 기능이 호출되는지 여부를 확인할 수 있습니다.

0

거짓. 이 작업의 어려움과 오버 헤드를 무시하면 유용 할 이유가 없습니다.

모듈에서 정의되었지만 해당 모듈의 다른 곳에서 호출되지 않은 함수가 다른 모듈에서 호출 될 수 있으므로 경고를받을 자격이 없습니다.

파이썬이 프로그램 과정에서 실행되는 모든 모듈을 분석하고 호출되지 않은 함수에 대한 경고를 인쇄하는 경우이 특정 실행의 입력으로 인해 함수가 호출되지 않았을 수 있습니다. 아마도 계산기 프로그램에서 "곱하기"함수가 있지만 사용자는 일부 숫자를 합산하라는 요청을했을뿐입니다.

파이썬이 프로그램을 구성하는 모든 모듈을 분석하고 호출 할 수없는 함수에 대한 경고를 인쇄한다면 (이것은 불가능하지만 여기 나와 함께 있어야 함) 의도 한 기능에 대해 경고합니다 다른 프로그램에서 사용하십시오. 예 : 계산기 프로그램이 두 개 있고 단순한 프로그램과 고급 프로그램이있는 경우 calc.py 유틸리티 함수가있는 경우 explog과 같은 고급 함수를 간단한 프로그램의 일부로 사용하면 호출 할 수 없지만 그럴 수는 없습니다. 고급 프로그램에 필요하기 때문에 경고가 표시됩니다.

관련 문제