IT story

__init__.py에서 참조 'xxx'를 찾을 수 없음-Python / Pycharm

hot-time 2020. 12. 30. 19:15
반응형

__init__.py에서 참조 'xxx'를 찾을 수 없음-Python / Pycharm


Pycharm에 다음과 같이 구성된 프로젝트가 있습니다.

-- Sources
   |--__init__.py
   |--Calculators
      |--__init__.py
      |--Filters.py
   |--Controllers
      |--__init__.py
      |--FiltersController.py
   |--Viewers
      |--__init__.py
      |--DataVisualization.py
   |--Models
      |--__init__.py
      |--Data

내 모든 __init__.py 소스 바로 위의 소스를 제외하고 는 빈 파일입니다. 나는 많은 종류의 경고를 받고 있습니다.

__init__.py에서 참조 'xxx'를 찾을 수 없습니다.

예를 들어, 내 FiltersController .py에는 다음 코드가 있습니다.

import numpy.random as npr

bootstrap = npr.choice(image_base.data[max(0, x-2):x+3, max(0, y-2):y+3].flatten(), size=(3, 3), replace=True)

그리고이 경고를받습니다.

__init__.py에서 참조 'choice'를 찾을 수 없습니다.

나는 이것이 무엇을 의미하는지 그리고 파이썬에서 올바르게 코딩하기 위해 무엇을 해야하는지 궁금해하고 있습니다.

미리 감사드립니다.


이것은 pycharm의 버그입니다. PyCharm은 참조 된 모듈이 __all__ = []명령문에 포함될 것으로 예상하는 것 같습니다 .

적절한 코딩 에티켓 __all__을 위해 모듈 설명 을 포함해야 합니까? .. 이것은 실제로 어린 스팍이 시험을받는 동안 대답하는 것을 듣는 질문입니다. 그는 "도덕적으로 칭찬 할 만하지 만 도덕적으로 의무적이지는 않습니다."라고 대답했습니다.

이 문제를 해결하려면 전체적으로 해당 (매우 중요하지 않은) (매우 유용함) 검사 를 비활성화 하거나 특정 함수 또는 명령문에 대해 억제 할 수 있습니다.

그렇게하려면 :

  • 오류가있는 텍스트 위에 캐럿을 넣습니다 (위의 예에서 '선택').
  • 인텐션 메뉴를 불러옵니다 (기본적으로 alt-enter, 광산은 alt-backspace로 설정 됨).
  • 오른쪽 화살표를 눌러 하위 메뉴를 열고 관련 작업을 선택하십시오.

PyCharm에는 이와 같은 작은 버그가 있지만 제 생각에는 그 이점이 단점보다 훨씬 큽니다. 다른 좋은 IDE를 사용하고 싶다면 Spyder / Spyderlib도 있습니다.

나는 이것이 당신이 당신의 질문을 한 후에 꽤 많은 것을 알고 있지만 이것이 도움이되기를 바랍니다 (당신 또는 다른 사람).

편집 됨 : 원래는 이것이 검사에만 국한된 것이라고 생각 __all__했지만보다 일반적인 '해결되지 않은 참조'검사 인 것 같아 매우 유용 할 수 있습니다. 위에서 언급 한 메뉴를 사용하거나 # noinspection PyUnresolvedReferences명령문 앞 줄 에 지정하여 기능의 명령문 수준 비활성화를 사용하는 것이 가장 좋습니다 .


먼저 이것을 살펴 봐야 합니다 . 이것은 패키지를 가져올 때 발생하는 일을 설명합니다. 편의상:

import 문은 다음 규칙을 사용합니다. 패키지의 __init__.py코드가라는 목록을 정의하는 __all__경우 from package import *발견 될 때 가져와야하는 모듈 이름 목록으로 간주 됩니다. 패키지의 새 버전이 릴리스 될 때이 목록을 최신 상태로 유지하는 것은 패키지 작성자에게 달려 있습니다. 패키지 작성자는 패키지에서 *를 가져 오는 용도가 보이지 않는 경우 지원하지 않기로 결정할 수도 있습니다.

따라서 PyCharm은 경고 메시지를 표시하여이를 존중하므로 작성자는 패키지에서 *를 가져올 때 가져올 모듈을 결정할 수 있습니다. 따라서 이것은 PyCharm의 유용한 기능인 것 같습니다 (그리고 버그라고 부를 수는 없습니다). __all__다음과 같이 목록 에있는 변수 에 패키지를 가져올 때 가져올 모듈의 이름을 추가하여이 경고를 쉽게 제거 할 수 있습니다.

__init__.py

from . import MyModule1, MyModule2, MyModule3
__all__ = [MyModule1, MyModule2, MyModule3]

이것을 추가 한 후에 ctrl+click는 프로젝트의 다른 부분에서 사용되는 이러한 모듈 이름을 사용하여 선언으로 직접 이동할 수 있는데, 이는 종종 매우 유용하다고 생각합니다.


나는 이것이 오래되었다는 것을 알고 있지만 Google이 나를 여기로 보냈으므로 다른 사람들도 나처럼 올 것이라고 생각합니다.

2018 년의 대답은 여기에서 선택된 것입니다. Pycharm : 작업중인 프로젝트를 열 때 IDE에서 "unresolved reference"오류 발생

하나만 추가 Content Root할 수 있지만 여러 Source Folders. init .py 파일 을 만질 필요가 없습니다.


패키지에 init .py 를 추가하는 것을 잊으셨습니까 ?


다음과 같이 소스 디렉토리를 소스 루트로 표시 할 수 있습니다.

  • 소스 디렉토리를 마우스 오른쪽 버튼으로 클릭
  • 디렉토리를 다음으로 표시-> 소스 루트
  • 파일-> 캐시 무효화 / 다시 시작 ...-> 무효화 및 다시 시작

나는 약간 다른 방식으로 내 pycharm 에서이 문제를 해결했습니다.

설정-> 프로젝트 인터프리터로 이동 한 다음 거기에서 기본 패키지를 클릭합니다.

다음과 같은 페이지가 표시됩니다.

problemGuide

After that when your package is installed then you should see the package is colored blue rather than white.

And the unresolved reference is also gone too.

ReferenceURL : https://stackoverflow.com/questions/23248017/cannot-find-reference-xxx-in-init-py-python-pycharm

반응형