2017-09-03 1 views
0

나는이처럼 보이는 파이썬 라이브러리 (안 내) 작업입니다 :가져 오기가 파이썬에서 부작용을 일으키는 라이브러리를 패키지하는 방법은 무엇입니까?

. 
├── README.md 
├── setup.py 
└── library 
    ├── __init__.py 
    ├── core.py 
    ├── a.py 
    └── b.py 

자체가 a.pyb.py 사용 core.py의 파일 __init__.py 메이크업 사용. 유의해야 할 중요한 점은 의도적으로 의도 된 일부 부작용이 있다는 것입니다. import library.

그러나 사용자에게 부작용없이 core.py의 기능을 사용할 수있는 가능성을 제공하고자합니다. 아쉽게도 import library.core 또는 from library import core__init__.py (부작용이 발생하는 곳)을 실행합니다.

이 문제를 해결하기 위해 패키지와 setup.py을 어떻게 재구성 할 수 있습니까?


나는 이런 식으로 생각 :

. 
├── README.md 
├── setup.py 
├── library_core 
│ ├── __init__.py 
│ ├── core.py 
│ ├── a.py 
│ └── b.py 
└── library 
    └── __init__.py # Import library_core and apply side effects 

내가 packages = ['library', 'library_core']setup.py를 업데이트 할 것입니다. 이렇게하면 library을 가져 오면 아무 것도 변경되지 않지만 사용자는 부작용없이 library_core을 가져올 수 있습니다. 또한 이것은 코드 복제를 피할 것이고 모든 것이 동일한 저장소에 남을 것입니다.

library_corelibrary에서 가져올 수 없기 때문에 불행히도 파일 트리의 같은 위치에 있지 않기 때문에이 기능이 작동하지 않습니다.

+0

* "나는 도서관에서 library_core를 가져올 수있는 능력이 없기 때문에 불행하게도,이 작동하지 않습니다" * - 이것이 당신의 주된 문제인 것처럼 보이는데,'라이브러리/__ init __. py'에서'library_core import core'를 시도하면 어떻게 될까요? – Kos

+0

@Kos 사실,이게 효과가있을 수 있습니다.라이브러리 _ 코어 가져 오기 *'는 분명히 실패했지만 간단히'import library_core'는 패키지가'python setup.py install'과 함께 ** 설치되면 작동합니다. 나는 이것이 갈 길이라고 생각한다. 그래서 나는 그 질문을 비 웁니다. – Delgan

답변

0

두 가지 패키지를 사용하는 것이 가장 좋은 방법 인 것 같습니다.

인접한 두 패키지를 사용하면 (예 : python setup.py install)이 설치된 경우에만 을 사용할 수 있습니다. 예를 들어 단위 테스트의 경우 개발을 상당히 복잡하게 만듭니다. 설치되지 않은 경우 library_core을 찾을 수 없으므로 import library을 수행 할 수 없습니다.

따라서 가장 좋은 해결책은 단순히 하위 패키지를 만들고 package_dir 옵션 덕분에 library_core이있는 setup.py 내에서 지정하는 것입니다.

파일 나무는 다음과 같이 보일 것이다 :

. 
├── README.md 
├── setup.py 
└── library 
    ├── __init__.py 
    └── core 
     ├── __init__.py 
     ├── a.py 
     └── b.py 

그리고 setup.py에서을 :

setup(
    name = 'library', 
    packages = ['library', 'library.core', 'library_core'], 
    package_dir = {'library_core': 'library/core'}, 
    ... 
) 
0

부작용을 피하고 사용자가 문서화 된 함수를 호출하여 명시 적으로 트리거해야한다고 권장합니다. 그렇지 않으면 잃어버린 전투와 싸우고 있습니다. 기본값은 현재 부작용을 유발하고 사용자가 원하지 않는 경우 실행을 취소해야합니다.

+0

이것은 내 라이브러리가 아니므로 이미 널리 사용되어 현재의 동작을 변경할 방법이 없습니다. – Delgan

+0

규칙에 대한 일반적인 예외는 polyfill 라이브러리입니다. '__future__ import absolute_import'에서 비교하고 대조하십시오. 하지만 예, 불편합니다. 예를 들어 flake8은 "사용되지 않은"수입에 대해 불평 할 것입니다. – Kos

관련 문제