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
'IT TIP' 카테고리의 다른 글
xcode 단위 테스트에서 파일로드 (0) | 2020.12.29 |
---|---|
Babel.js로 Async Await 제안을 트랜스 파일 하시겠습니까? (0) | 2020.12.29 |
Angular 2의 자식 구성 요소에서 부모 구성 요소 속성 업데이트 (0) | 2020.12.29 |
'router-outlet'은 알려진 요소가 아닙니다. (0) | 2020.12.29 |
emacs에서 ^ M 숨기기 (0) | 2020.12.29 |