2013-11-27 3 views
4

나는 Python에 새로운 기능이 있으며 일부 코드를 다시 사용하기위한 모듈을 만들고 있습니다. 내 모듈 (impy.py)는 다음과 같습니다 ...파이썬 모듈 : 새 모듈에서 호출하는 모듈을 가져 오는 것을 방지하는 방법

import numpy as np 
def read_image(fname): 
    .... 

을 (그것은 지금까지 한 기능을 가지고있다)과는 다음 디렉토리에 저장됩니다 : 당신이 볼 수 있듯이

custom_modules/ 
       __init.py__ 
       impy.py 

는 사용 모듈 numpy. 문제는 내가 ... 이런 식으로, 다른 스크립트에서

import custom_modules.impy as im 

을 가져올 내가 im.를 입력 할 때이 기능 read_image()뿐만 아니라 모듈 np뿐만 아니라 전화의 옵션을 얻을 수 있다는 것입니다.

내 모듈에서 작성한 기능이 아니라 내 모듈에서 호출하는 모듈 (이 경우 numpy) 만 사용할 수 있도록하려면 어떻게해야합니까?

도움 주셔서 감사합니다.

+0

'import'는 모듈을 모듈의 메모리 공간에 속하게하기 때문에 꽤 정상입니다. 그럼, "나는 (...) 부름의 선택권을 얻는다"는 것은 무엇을 의미합니까? 이것이 당신 IDE의 제안입니까? 이 경우 –

+0

@ Joël 예, IDE (Spyder)의 제안입니다. 하지만 어쨌든 나는 사용자가 내 모듈을 통해 numpy를 호출 할 수 있다는 것이 좋지 않다고 생각하고 그 모듈을 막는 방법이어야한다. – betelgeuse

+0

글쎄, 나는 이것이 IDE의 문제라고 말하고 싶다. 파이썬은 사용 가능한 모든 객체에 대한 참조를 제공합니다. –

답변

0

당신은 당신의 함수 read_image 코드가 로컬로 사용할 수 있도록

def read_image(fname): 
    import numpy as np 
    .... 

내부 NumPy와 수입하지만, 전 세계적으로 사용할 수 없습니다.

경고 - 특히 read_image을 여러 번 실행하는 경우 실적이 저하 될 수 있습니다 (코드를 처음 가져올 때 한 번만 실행하면 될 때마다 numpy을 가져 오기 때문에).

+0

네, 그게 문제입니다. 나는 여러 번 그 기능을 실행해야하고, 또한 다른 기능에 의해 호출됩니다 ... 그래서 내가 다른 솔루션을 가지고 싶었어 ... 고마워! – betelgeuse

+1

게으이든 아니든 처음으로 가져 오기가 수행됩니다. 이미 sys.modules에있는 모듈을 가져 오면 이름 만 바인딩되며 모듈의 코드는 다시 실행되지 않습니다. – geoffspear

+0

'numpy'가 모듈에서 사용할 수있는 유일한 함수에 의해 필요하다면, 어쨌든 import가 수행되기 때문에 함수 안에서 import를 숨길 필요가 없습니다. 더욱이 함수가 여러 번 호출되는 경우 비용이 많이 들지 않더라도 가져 오기에 대한 검사가 여러 번 수행됩니다. –

1

"클래스/모듈 가져 오기에서 클래스/모듈 속성을 엉망으로 만들고 싶지 않습니다."라는 질문에 대한 답을 얻을 수있었습니다. Idle은 클래스 나 모듈 내에서 가져온 모듈에 대한 액세스를 제안하기 때문에

이것은 단순히 코드 작성자가 액세스하지 않으려는 기존의 이름을 사용하고 IDE는 제안하지 않기로되어 있습니다. 이름은 밑줄로 시작합니다. 이는 PEP 8/Naming styles에 설명 된대로 약한 "내부 사용"표시기라고도합니다.

class C(object): 
    import numpy as _np # <-- here 
    def __init__(self): 
     # whatever we need 
    def do(self, arg): 
     # something useful 

이제 유휴에서, 자동 완성은 do 기능을 제안한다; 가져온 모듈이 제안되지 않았습니다.

그런데 질문 제목을 변경해야합니다. 즉, 가져온 모듈을 가져 오지 않으므로 (사용하지 못할 수 있기 때문입니다) "가져온 모듈을 표시하는 방법 수입 모듈의 "또는 이와 유사한 것.

+0

마지막 진술에 동의합니다. 질문 제목을 업데이트해야합니다. – Soviut

0

당신이 정말로 그것을 숨기고 싶은 경우에, 나는 당신의 구조는 다음과 같습니다 있도록 새로운 디렉토리를 생성하는 것이 좋습니다 :

custom_modules/ 
    __init__.py 
    impy/ 
     __init__.py 
     impy.py 

새로운 impy/__init__.py

이 방법

from impy import read_image 
를 포함 할 수 있도록, custom_modules.impy 네임 스페이스에서 끝나는 것을 제어 할 수 있습니다.