2017-09-06 4 views
2

나는 그 당시의 상황을 추적하는 데 거의 한 시간을 소비했습니다. 매우 혼란스러운 오류 메시지입니다.오염 된 네임 스페이스에 물린 것을 피하십시오.

fspec_prsrs = tuple(compile('{{{}{}}}'.format(fstr_tup.field_name 
               if fstr_tup.field_name else '', 
               ':'+fstr_tup.format_spec 
               if fstr_tup.format_spec else '' 
              ) 
          ) 
        for fstr_tup in fstr_tuples) 

이 오류가 발생했습니다 :

*** TypeError: Required argument 'filename' (pos 2) not found 
오류의 소스는 코드 블록 (이 질문의 목적을 위해, 모든 조각의 의미는별로 중요하지 않습니다)이었다

오류의 원인은 내가 파일 parse module에서 (위로) compile 함수의 가져 오기를 무시한 것입니다.

결과적으로 compilebuilt-in compile function을 나타냅니다. 오류 메시지가 원인을 이해하고 나에게 매우 명확하게 보일지라도, 나는 이라고 생각한 패키지 소스 코드를보고 많은 시간을 낭비하는 결과를 보았습니다. 오류가 거기에서 왔다고 생각했습니다. 대신 내장 된 compile에서 온 것입니다.

compile 기능은 잊어 버리는 경향이 있습니다. 만약에 이제까지 내가 좀처럼 그것을 사용하지 않으며, 실제로 나는 또한 사용하지 않습니다 단지 compile 같은 내장 된 목록에서 기능의 수 (나는 당신, id 찾고 있어요이 있고, 당신, filter!), 결과적으로 그들은 내 네임 스페이스를 오염시키는 것 외에는 아무 것도하지 않고 앉아 있습니다.

일반적으로 가져 오기를 잊어 버리면 NameError이 표시되며 그 원인은 분명합니다. 네임 스페이스에 숨어있는 것들이있을 때 거기에 넣지 않은 것은 훨씬 덜 분명합니다. 이런 문제를 피할 수있는 완전한 방법이 있습니까?

수행 할 수있는 작업은 무엇입니까? 아니면 모든 파이썬 코더가 함께 배우기 만하면되는 무언가입니까?

+1

아마도 내장 된 이름을 강조 표시하는 IDE를 사용하고 있을까요? 그렇게하면 코드가 기본 제공 이름을 참조하는지 여부가 명확 해집니다. Pycharm이 이것을합니다. 뿐만 아니라 숭고한. –

+0

@ChristianDean 내가 가진 솔루션이 나에게는 분명하지 않다는 것을 IDE를 정기적으로 사용 해본 적이 없기 때문에, 사람들이 가지고있는 것이 분명하다고 확신 할지라도. 나는 일반적으로 "나는 IDE가 필요 없다"라고 말했지만 (나는 단지 메모장 ++을 사용한다.) 나는 오늘 내가 내가 그걸 증명했다고 생각한다. –

답변

2

이 문제를 피할 수있는 유일한 아이디어는 네임 스페이스에 개체를 가져 오기 시작하지 않는 것입니다. 예를 들어, 대신의 경우 :

from parse import compile 

하나는 할 것 :

import parse 
parse.compile(...) 

이 문제를 해결합니다. 그러나, 그 모듈의 parse 패키지에서 사용하려는 유일한 것은 compile이기 때문에이 솔루션이 마음에 들지 않습니다. 독자에게 좀 더 직접적이고 명확합니다. (즉, Future Me) WHYWHAT 내가 가져 오는 내용이 바로 앞에 올 때 parse 모듈을 사용하고 있습니다.

더 좋은 해결책은 내가 일하고있는 모듈에서 내게 사용되지 않는 전역 네임 스페이스의 것들을 제거하는 "설정하고 잊어 버리는"방법 일 것입니다.

+0

'from some parse import compile from 은 미래의 이해에 적합할까요? – Eric

+0

@ Eric 나는 모른다. .. 미래는 나에게는 꽤 어리 석다. 그것은 일반적으로 좋은 제안이지만 내 불평은 순서대로 * 기억할 필요가 있습니다. 나는 그럴 필요가 있습니다. 나는 처음부터 네임 스페이스 오염에 대해 염두에 두어야 할 것입니다. 이 mindfulness는 처음부터 문제의 근원이었습니다. –

+0

'from import '은 비교적 grep하기 쉬운 패턴이므로, 이런 종류의 수차에 대한 코드를 자동으로 스캔 할 수 있습니다. 또는 [Pylint] (https://pylint.readthedocs.io/en/latest/how_tos/plugins.html)에 대한 플러그인을 작성할 수도 있습니다. – Eric

관련 문제