IT TIP

PEP8 – sys.path를 사용하여 파일 맨 위에 가져 오지 않음

itqueen 2020. 12. 29. 08:11
반응형

PEP8 – sys.path를 사용하여 파일 맨 위에 가져 오지 않음


문제

PEP8에는 파일 맨 위에 가져 오기를 배치하는 규칙이 있습니다.

가져 오기는 항상 파일의 맨 위에, 모듈 주석 및 독 스트링 바로 뒤, 모듈 전역 및 상수 앞에 놓입니다.

그러나 어떤 경우에는 다음과 같이 할 수 있습니다.

import sys
sys.path.insert("..", 0)

import my_module

이 경우 pep8명령 줄 유틸리티는 내 코드에 플래그를 지정합니다.

E402 모듈 수준 가져 오기가 파일 맨 위에 없습니다.

sys.path수정 사항과 함께 PEP8 준수를 달성하는 가장 좋은 방법은 무엇입니까 ?

이 코드 The Hitchhiker 's Guide to Python에 제공된 프로젝트 구조를 따르고 있기 때문 입니다.

이 가이드는 my_module폴더와 별개의 tests폴더가 있으며 둘 다 같은 디렉토리에 있다고 제안합니다 . 내가 액세스하려는 경우 my_module에서 tests, 내가 추가 할 필요가 있다고 생각 ..받는sys.path


종종 foo/tests내 프로젝트 의 하위 디렉터리 테스트가 포함 된 여러 파일이 있지만 테스트중인 모듈은 foo/src. foo/tests가져 오기 오류없이 테스트를 실행하기 위해 foo/tests/pathmagic.py다음과 같은 파일 만듭니다 .

"""Path hack to make tests work."""

import os
import sys

bp = os.path.dirname(os.path.realpath('.')).split(os.sep)
modpath = os.sep.join(bp + ['src'])
sys.path.insert(0, modpath)

모든 테스트 파일에서 다음을 사용합니다.

import pathmagic  # noqa

첫 번째 가져 오기로. "noqa"주석은 사용되지 않은 가져 오기에 대해 불평하는 것을 방지 pycodestyle하거나 방지 pep8합니다.


가져 오기가 몇 개만있는 경우 해당 import행에서 PEP8을 무시할 수 있습니다 .

import sys
sys.path.insert("..", 0)
import my_module  # noqa: E402

또 다른 해결 방법이 있습니다.

import sys
... all your other imports...

sys.path.insert("..", 0)
try:
    import my_module
except:
    raise

나는 비슷한 질문으로 어려움을 겪었고 받아 들인 대답보다 약간 더 좋은 해결책을 찾은 것 같습니다.

pathmagic실제 sys.path 조작을 수행하지만 컨텍스트 관리자 내에서 변경 하는 모듈을 만듭니다 .

"""Path hack to make tests work."""

import os
import sys

class context:
    def __enter__(self):
        bp = os.path.dirname(os.path.realpath('.')).split(os.sep)
        modpath = os.sep.join(bp + ['src'])
        sys.path.insert(0, modpath)

    def __exit__(self, *args):
        pass

그런 다음 테스트 파일 (또는 필요할 때마다)에서 다음을 수행합니다.

import pathmagic

with pathmagic.context():
    import my_module
    # ...

이렇게하면 flake8 / pycodestyle에서 불만을받지 않고 특별한 주석이 필요하지 않으며 구조가 의미가있는 것 같습니다.

추가 깔끔함을 위해 실제로 __exit__블록 에서 경로를 되 돌리는 것을 고려하십시오. 이 경우 지연 가져 오기에 문제가 발생할 수 있으므로 (모듈 코드를 컨텍스트 외부에 배치하는 경우) 문제가 없을 수도 있습니다.


EDIT: Just saw a much simpler trick in an answer to a different question: add assert pathmagic under your imports to avoid the noqa comment.


Did you already try the following:

import sys
from importlib import import_module

sys.path.insert("..", 0)

# import module
my_mod = import_module('my_module')

# get method or function from my_mod
my_method = getattr(my_mod , 'my_method')

To comply with the pep8, you should include your project path to the python path in order to perform relative / absolute imports.

To do so, you can have a look at this answer: Permanently add a directory to PYTHONPATH

ReferenceURL : https://stackoverflow.com/questions/36827962/pep8-import-not-at-top-of-file-with-sys-path

반응형