2015-02-06 2 views
1

오늘 내장 함수 min()에 대한 이상한 버그가 있습니다. 내 프로그램을 실행하는 동안 다시 쓰여지고 있다는 것을 알았으므로 min()이 덮어 쓰기 (print(min.__module__))되면 스택의 모든 기능을 살펴 보았습니다. : 로컬 변수 'min'이 전에 참조되었습니다. 할당 여전히 디버깅 중이며 커밋간에 앞뒤로 이동하여 문제의 원인을 확인합니다. 프로그램은 다른 모듈에 따라 다르지만 모듈은 프로그램이 성공한 마지막 시간과 동일합니다.파이썬 내장 함수를 어떻게 삭제할 수 있습니까? 어떤 함수가 호출 될 때 min()이 사라집니다.

기본 "min"은 어떻게 삭제할 수 있습니까? 나는 그 이름으로 어떤 변수도 선언하지 않았을 것이라고 확신한다.

(I 시도 3 시스템 2)이 가능한 방법의 모든 아이디어를 작동 [ '분'] 내장 명령 del min는 내장을 복원해야합니다 (그러나 내 경우에는 내가 오류가 위의 수)?

답변

5

local variable referenced before assignment의 원인은 당신이 당신이 그 오류를 받고 시점 후 기능 어딘가에 min라는 변수에 할당 한 것을이다, 사람이 min를 삭제 한 것이 아니다. (할당은 전에 오류를 을 촬영되지 않은 if 지점에있을 수 있지만 내 경험에서 내가 제안하는 첫 번째 시나리오는 가능성이 높습니다.)

당신이 기능 어딘가에 할당했기 때문에 전역 변수를 선언하지 않은 경우 해당 함수 내부의 로컬 변수이며 모든 사용은 내장 함수가 아니라 해당 지역 변수를 참조합니다. 그러나 아직 값을 지정하지 않았으므로 파이썬은 원하는 값을 알지 못합니다.

예 :

def test(): 
    x = min(1, 2, 3)     # error message here 
    y = max(1, 2, 3) 
    # ... lots of code might go here 
    min = x if x < y else y   # local assignment here 

test() 

솔루션은 간단하다. 그러지 마. 자신의 변수에 min 이외의 이름을 사용하십시오. 사실 바로이 이유 때문에 자신의 목적을 위해 내장 함수의 이름을 사용하지 않는 것이 좋습니다.

+2

** "해결책은 간단합니다. "** 진정한 프로그래머 - 그의 대답조차도 재사용이 가능합니다! DRY indeed –

+0

@kindall 세 번째 시나리오는 min (a, b)를 함수의 인수 (아마도 인수를 수정 함)로 전달하거나 사전에 값으로 전달하는 것과 같을 수 있습니까? 저는 그 이름을 선택하지 않았을 것입니다, 나는 프로젝트의 모든 파일에서 그것을 검색하기까지했습니다! – lib

+1

하지 않아야합니다. 실제로 오류가 발생한 부분의 코드 만 게시하면 문제를 해결하는 데 도움이됩니다. – kindall

2

당신은 그것을 삭제할 수 있지만 명시 적으로해야 할 것 :

>>> min(5,5) 
5 
>>> del __builtins__.min 
>>> min(5,5) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'min' is not defined 

그냥 함수가 __builtins__에서 제거되지 않습니다, 그래서 당신의 수신자가 목적에 그 일을해야 내에서 삭제 일반적으로

+0

죄송합니다. 질문에 형식이 누락되었습니다. 사실 함수는 여전히 __builtins__에 있습니다. 오류는 min = __builtins __ [ 'min'] 인 하나의 시스템에서만 발생합니다. TypeError : 'module'객체는 subscriptable이 아닙니다. – lib

관련 문제