2017-02-22 1 views
0

이 방법으로 pkg 패키지를 만들었습니다. 아래__all__이 정의되지 않은 경우에도 pkg import *에서 모듈 가져 오기가 끝나는 이유는 무엇입니까?

$ tree 
. 
└── pkg 
    ├── foo.py 
    └── __init__.py 

1 directory, 2 files 
[email protected]:~/so$ cat pkg/__init__.py 
[email protected]:~/so$ cat pkg/foo.py 
print('executing module foo ...') 

def bar(): 
    print('bar') 

모든 파이썬 쉘 조각은 파이썬 인터프리터 단일 대화 형 세션입니다. 사이에 내 자신의 해설을 추가하려면 블록을 여러 개로 나눕니다. 블록.

여기 내 파이썬 버전입니다.

Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

다음 가져 오기 foo__all__ 때문에이 __init__.py에 정의되어 있지 되어 가져올 수 없습니다.

>>> from pkg import * 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 
>>> 

상기 동작은

https://docs.python.org/3/tutorial/modules.html#importing-from-a-package에서 파이썬 튜토리얼에서 설명되었다. __all__가 정의되어 있지 않으면

는 문 from sound.effects import * 는 현재 이름 공간에 패키지 sound.effects에서 모든 서브 모듈을 가져올 수 없습니다; 패키지 sound.effects에 을 가져 왔고 (가능하면 __init__.py에 초기화 코드를 실행) 패키지에 정의 된 이름을 가져 오게합니다.

다음과 같은 수입품은 bar()입니다. foo을 가져올 수 없습니다.

>>> from pkg.foo import bar 
executing module foo ... 
>>> bar() 
bar 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 

는 그러나 이상하게 이전 수입 후, 다음과 같은 가져 오기 __init__.py에 정의되어 있지 않은 foo__all__ 경우 수입 을 끝납니다.

>>> from pkg import * 
>>> foo.bar() 
bar 

왜 이런 일이 발생합니까?

답변

0

당신은 모듈 foo뿐만 아니라 foo__init__.py 아닌 기능을 가져 from pkg import * 사용할 때, 인용 파이썬 문서의 기반으로.

나는 마지막 코드가 이미 foo에서 직접 bar()을 수입하고 엄격 바 기능이 foobar() 사이의 연결을 설정 가져온 후 foo을 다시 가져했기 때문에 작품을 제공 니펫을 생각한다.

__all__을 지정할 때 동일한 문제가 발생합니까?

+0

''모듈'foo'를 가져올 것이다. '__all__'을 지정하면 같은 문제가 발생하지 않습니다. 내가 궁금한 점은'from pkg import *'가 문서와 일치하는지, 즉'foo'를 가져 오지 않지만'from pkg import * '의 두 번째 발생은 문서를 위반하고'foo'를 가져 오는 이유입니다. –

0

foofrom pkg.foo import bar 일 때 pkg 네임 스페이스에 이미 pkg.foo으로 가져 왔습니다. 따라서 pkg 네임 스페이스의 모든 이름을 현재 범위로 가져 오면 foo도 가져올 수 있습니다.참조 : __all__`이 정의 '하지 않는 한

>>> import pkg 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> from pkg.foo import bar 
executing module foo ... 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'foo'] 

(I 파이썬 2 모르지만, 이것에 대한 논리가 동일) PKG 수입 *에서

관련 문제