2014-09-21 9 views
1

클래스/메소드/등의 여러 위치를 피하는 방법은 무엇입니까? 파이썬 패키지의 네임 스페이스 안에서? 다음 디렉토리 구조와 코드를 가진 패키지를 고려하십시오.하위 모듈이 네임 스페이스 w/__init__.py에 나타나지 않도록하십시오.

dummyproj/ 
├── __init__.py 
└── main.py 

.

# main.py 
# ======= 
def dummy_func(): 
    print "hello world" 

.

# __init__.py 
# =========== 
from main import * 

이 구성을 사용하면 dummy_func 기능을 패키지 내에서 사용할 수 있습니다. 그러나 main이라는 하위 모듈에서도 사용할 수 있습니다. 예를 들어 :

>>> import dummyproj 
>>> dir(dummyproj) 
['__builtins__', 
'__doc__', 
'__file__', 
'__name__', 
'__package__', 
'__path__', 
'dummy_func', 
'main'] 
>>> dummyproj.dummy_func() 
hello world 
>>> dummyproj.main.dummy_func() 
hello world 

은 어떻게 dummy_proj 네임 스페이스에 표시에서 main을 방지 할 수? 내 이해는 dummy_func에 대한 코드를 __init__.py에 포함시키는 것은 나쁜 형식입니다.

+0

'dummy_func'이 두 곳에서 표시 되더라도 위에서 설명한대로 허용되는 방법입니까? –

+0

도와 줘서 고마워, 루카스. 나는'requests' 모듈에 대해 어느 정도 익숙하다. 그래서 당신의 요지를 만드는 효과적인 예제이다. 이 효과에 대한 답을 대답으로 제출하면 받아 들일 수 있습니까? –

답변

1

당신은 할 수 없습니다 (깨끗하고 일반적으로 받아 들여지는 방식으로).

하지만 질문은 무엇이 필요하겠습니까? 이상적으로 라이브러리 사용자는 라이브러리의 API에 대해 알아보기 위해 설명서를 사용하므로 dir()을 사용하지 않아도됩니다.

그리고 만약 내가 dir()을 사용한다면 아마 내가하고있는 라이브러리를 디버깅 할 때 라이브러리 구조가 나에게서 난독 화되기를 원하지 않을 것이다.

그러니 그냥 패키지, 대부분의 도서관이 그런 식으로 완벽하게 허용 구축되어 당신이 당신의 예에서했던 방식으로 구조화 : 그들 중

  • 를 사용하여 서브 모듈/패키지, 아마도 여러 수준, A의 코드를 구성하기를 합리적인 방법
  • 그런 다음 등

아주 좋은 시험/자주 사용하는 기능을/클래스의 최상위 레벨 패키지에서 편리 수입을 제공 | (quickstart docs

import requests 
requests.get(url) 

get() 함수가 convenience import at the top-level package로서 제공되고, 또한 그 방법을 설명한다 : PLE는 requests 모듈 API docs). 그러나 get() 함수는 실제로 requests.api.get에 있습니다.sqlalchemy.sql.schema.Column에서

Column 수준의 삶 :


또 다른 좋은 예는도 여러 편의 수입의 수준을 사용 SQLAlchemy이다. 그러나 편리함 가져 오기는 sqlalchemy.schema.Column으로 제공되며, 맨 위의 경우도 으로 제공됩니다. (비록 내가 알 수있는 한 sqlalchemy.schema 네임 스페이스는 단순히 호환성 문제 때문입니다.)

0

쉬운 방법은 없습니다. (내가 알고있는 것 이상)

del을 사용하여이를 지우거나 함수를 사용하여 모듈을 생성 할 수 있습니다. 이런 식으로 : (__init__.py).

def __init__mod(): 
    from main import dummy_func 

    g = globals() 
    g['dummy_func'] = dummy_func 

__init__mod() 
0

그냥 __init__.py 파일 삭제 :

# __init__.py 
# =========== 
from main import * 
del main 
관련 문제