`from… import` 대`import .`
이 질문에는 이미 답변이 있습니다.
코드 조각간에 차이가 있는지 궁금합니다.
from urllib import request
그리고 조각
import urllib.request
또는 상호 교환 가능한 경우. 그것들이 상호 교환 가능한 경우, "표준"/ "선호"구문은 무엇입니까 (있는 경우)?
감사!
참조 할 때 가져 오기에 액세스하려는 방법에 따라 다릅니다.
from urllib import request
# access request directly.
mine = request()
import urllib.request
# used as urllib.request
mine = urllib.request()
단순성을 위해 가져 오거나 내장 된 마스킹을 피하기 위해 직접 별명을 지정할 수도 있습니다.
from os import open as open_
# lets you use os.open without destroying the
# built in open() which returns file handles.
많은 사람들이 이미 import
vs from
에 대해 설명 했으므로 실제 차이가있는 후드 아래에서 조금 더 설명하려고합니다.
우선, 기본 수입 명세서가하는 일을 정확하게 설명하겠습니다.
import X
모듈을 가져
X
오고 현재 네임 스페이스에서 해당 모듈에 대한 참조를 만듭니다. 그런 다음 모듈 내부에서 특정 속성 또는 메소드에 액세스하려면 완료된 모듈 경로를 정의해야합니다 (예 :X.name
또는X.attribute
)
from X import *
모듈을 가져
X
오고 현재 네임 스페이스에서 해당 모듈에 의해 정의 된 모든 공용 객체 (즉, 이름이로 시작하지 않는 모든 것_
) 또는 언급 한 이름에 대한 참조를 만듭니다 .즉,이 명령문을 실행 한 후에는 일반 (자격이없는) 이름을 사용하여 module에 정의 된 것을 참조 할 수
X
있습니다. 그러나X
그 자체는 정의되어X.name
있지 않으므로 작동하지 않습니다. 만약name
이미 정의 된, 그것은 새로운 버전으로 대체됩니다. 그리고 name inX
이 다른 객체를 가리 키도록 변경되면 모듈은 알 수 없습니다.이렇게하면 모듈의 모든 이름을 로컬 네임 스페이스에서 사용할 수 있습니다.
이제 우리가 할 때 어떻게되는지 보자 import X.Y
:
>>> import sys
>>> import os.path
sys.modules
이름 os
과 확인 os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
확인 globals()
및 locals()
이름으로 네임 스페이스 딕셔너리 os
과 os.path
:
>>> globals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> locals()['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> globals()['os.path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os.path'
>>>
위의 예 os
에서 로컬 및 글로벌 네임 스페이스 에만 추가되는 것으로 나타났습니다 . 따라서 os
다음 을 사용할 수 있어야합니다 .
>>> os
<module 'os' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> os.path
<module 'posixpath' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
...하지만 path
:
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
os
from locals()
네임 스페이스 를 삭제하면 다음에 존재하더라도 os
또는 에 액세스 할 수 없습니다 .os.path
sys.modules
>>> del locals()['os']
>>> os
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
이제를 보자 from
.
from
>>> import sys
>>> from os import path
sys.modules
이름 os
과 확인 os.path
:
>>> sys.modules['os']
<module 'os' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc'>
>>> sys.modules['os.path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
를 sys.modules
사용하여 가져올 때와 동일하게 보입니다 import name
.
괜찮아. 이름 공간 locals()
과 globals()
이름 공간이 어떻게 보이는지 확인하십시오 .
>>> globals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> locals()['path']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['os']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'os'
>>>
를 사용하여 액세스 할 수 path
있지만 다음 을 통해 액세스 할 수 없습니다 os.path
.
>>> path
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> os.path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'os' is not defined
>>>
locals ()에서 'path'를 삭제합시다 :
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
앨리어싱을 사용한 마지막 예 :
>>> from os import path as HELL_BOY
>>> locals()['HELL_BOY']
<module 'posixpath' from '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>> globals()['HELL_BOY']
<module 'posixpath' from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.pyc'>
>>>
경로가 정의되어 있지 않습니다.
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>
사용에 대한 한 가지 함정 from
name
두 개의 다른 모듈에서 동일하게 가져 오는 경우 :
>>> import sys
>>> from os import stat
>>> locals()['stat']
<built-in function stat>
>>>
>>> stat
<built-in function stat>
shutil
다시 통계 가져 오기 :
>>>
>>> from shutil import stat
>>> locals()['stat']
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>> stat
<module 'stat' from
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/stat.pyc'>
>>>
마지막 수입은 이길 것입니다
차이가 있습니다. 어떤 경우에는 그중 하나가 작동하고 다른 하나는 작동하지 않습니다. 예를 들면 다음과 같습니다.
foo.py
mylib\
a.py
b.py
지금, 나는 가져올 b.py
로 a.py
. 그리고 나는 가져올 a.py
에 foo
. 어떻게해야합니까? a
내가 쓴 두 가지 진술 :
import b
에서 foo.py
I 쓰기 :
import mylib.a
글쎄, 이것은 ImportError
실행하려고 할 때 생성 합니다 foo.py
. 인터프리터는 a.py
( import b
) 의 import 문에 대해 모듈이 없다고 불평 할 것 입니다. b. 그렇다면 어떻게 해결할 수 있습니까? 이러한 상황에서 a
로 가져 오기 명령문을 로 변경하면 import mylib.b
이후 a
로 b
는 작동하지 않으며 둘 다에 mylib
있습니다. 여기서 해결책 (또는 적어도 하나의 해결책)은 절대 가져 오기를 사용하는 것입니다.
from mylib import b
출처 : Python : 모듈을 가져 오는 모듈 가져 오기
패키지에서 Python3을 urllib로 사용하고 있습니다. 두 가지 형식 모두 허용되며 한 가지 형식의 가져 오기가 다른 형식보다 선호되지 않습니다. 때때로 여러 패키지 디렉토리가 관련된 경우 전자를 사용할 수 있습니다from x.y.z.a import s
URLLIB 패키지, 두번째 방법이 특별한 경우 import urllib.request
및 사용은 urllib.request
라이브러리 균일를 사용하는 방법 표준이다.
Python 2.x에서는 적어도 할 수 없습니다 import urllib2.urlopen
너가해야되는 from urllib2 import urlopen
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2.urlopen
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named urlopen
>>> import urllib.request
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named request
>>>
import urllib.request에 대한 나의 주요 불만은 urllib.parse를 가져 오지 않아도 참조 할 수 있다는 것입니다.
>>> import urllib3.request
>>> urllib3.logging
<module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'>
또한 urllib3 아래에 요청하십시오. 파이썬 2.7.4 우분투
참고 URL : https://stackoverflow.com/questions/9439480/from-import-vs-import
'IT story' 카테고리의 다른 글
포트 465와 587의 차이점은 무엇입니까? (0) | 2020.04.18 |
---|---|
Linq- 엔티티-SQL“IN”절 (0) | 2020.04.18 |
매주 크론 작업을 테스트하는 방법? (0) | 2020.04.18 |
지속 시간에 정수를 곱하는 방법? (0) | 2020.04.18 |
Linux에서 깨진 scp (보안 복사) 명령 프로세스를 계속할 수있는 방법이 있습니까? (0) | 2020.04.18 |