IT story

`from… import` 대`import .`

hot-time 2020. 4. 18. 09:37
반응형

`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.

많은 사람들이 이미 importvs from대해 설명 했으므로 실제 차이가있는 후드 아래에서 조금 더 설명하려고합니다.

우선, 기본 수입 명세서가하는 일을 정확하게 설명하겠습니다.

import X

모듈을 가져 X오고 현재 네임 스페이스에서 해당 모듈에 대한 참조를 만듭니다. 그런 다음 모듈 내부에서 특정 속성 또는 메소드에 액세스하려면 완료된 모듈 경로를 정의해야합니다 (예 : X.name또는 X.attribute)

from X import *

모듈을 가져 X오고 현재 네임 스페이스에서 해당 모듈에 의해 정의 된 모든 공용 객체 (즉, 이름이로 시작하지 않는 모든 것 _) 또는 언급 한 이름에 대한 참조를 만듭니다 .

즉,이 명령문을 실행 한 후에는 일반 (자격이없는) 이름을 사용하여 module에 정의 된 것을 참조 할 수 X있습니다. 그러나 X그 자체는 정의되어 X.name있지 않으므로 작동하지 않습니다. 만약 name이미 정의 된, 그것은 새로운 버전으로 대체됩니다. 그리고 name in X이 다른 객체를 가리 키도록 변경되면 모듈은 알 수 없습니다.

이렇게하면 모듈의 모든 이름을 로컬 네임 스페이스에서 사용할 수 있습니다.

이제 우리가 할 때 어떻게되는지 보자 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()이름으로 네임 스페이스 딕셔너리 osos.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 
>>>

osfrom locals()네임 스페이스 를 삭제하면 다음에 존재하더라도 os또는 에 액세스 할 수 없습니다 .os.pathsys.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.pya.py. 그리고 나는 가져올 a.pyfoo. 어떻게해야합니까? a내가 쓴 두 가지 진술 :

import b

에서 foo.pyI 쓰기 :

import mylib.a

글쎄, 이것은 ImportError실행하려고 할 때 생성 합니다 foo.py. 인터프리터는 a.py( import b) 의 import 문에 대해 모듈이 없다고 불평 할 것 입니다. b. 그렇다면 어떻게 해결할 수 있습니까? 이러한 상황에서 a가져 오기 명령문을 변경하면 import mylib.b이후 ab작동하지 않으며 둘 다에 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

반응형