programing

「…로부터.import와 import를 비교합니다.

firstcheck 2023. 1. 1. 11:43
반응형

「…로부터.import와 import를 비교합니다.

코드 조각에 차이가 있는지 궁금합니다.

from urllib import request

그리고 단편은

import urllib.request

또는 서로 교환할 수 있는지 확인합니다.호환성이 있는 경우는, 어느 쪽이 「표준」/「우선」구문입니까(있는 경우)?

Import를 참조할 때 Import에 액세스하는 방법에 따라 달라집니다.

from urllib import request
# access request directly.
mine = request()

import urllib.request
# used as urllib.request
mine = urllib.request()

또한 단순성을 위해 또는 빌트인의 마스킹을 방지하기 위해 Import할 때 직접 에일리어스를 지정할 수도 있습니다.

from os import open as open_
# lets you use os.open without destroying the 
# built in open() which returns file handles.

많은 분들이 이미 설명해주셨어요importfrom그래서 좀 더 자세히 설명하려고 합니다만, 실제의 차이는 어디에 있는지.

우선 기본 수입 명세서가 정확히 어떤 역할을 하는지 설명하겠습니다.

import X

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

from X import *

모듈을 Import합니다.X현재 네임스페이스에서 해당 모듈에 의해 정의된 모든 퍼블릭오브젝트에 대한 참조를 만듭니다(즉, 이름이 다음 문자로 시작하지 않은 모든 오브젝트)._또는 당신이 언급한 어떤 이름이라도 상관없습니다.

즉, 이 스테이트먼트를 실행한 후 플레인(수식되지 않은) 이름을 사용하여 모듈에서 정의된 것을 참조할 수 있습니다.X.그렇지만X정의되어 있지 않기 때문에X.name동작하지 않습니다.그리고 만약name이미 정의되어 있어 새로운 버전으로 대체되어 있습니다.그리고 만약 이름이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()namespace dict with nameos그리고.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부터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 했을 때와 똑같아 보입니다.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

「Import」를 했을 .name로부터: 2개의 모듈로부터:

>>> import sys
>>> from os import stat
>>> locals()['stat']
<built-in function stat>
>>>
>>> stat
<built-in function stat>

from 계 import statshutil 추가:

>>>
>>> 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'>
>>>

마지막 Import가 성공합니다.

차이가 있다.경우에 따라서는 한쪽이 작동하고 다른 한쪽이 작동하지 않을 수 있습니다.예를 들어 다음과 같은 구조를 가지고 있다고 가정합니다.

foo.py
mylib\
    a.py
    b.py

Import를 .b.pya.py 수입하고 a.py로로 합니다.foo거거어 떻떻? ???의 문(in)a

import b

»foo.py나는 다음과 같이 쓰고 있다.

import mylib.a

이렇게 '아, 아, 아'가 생성됩니다.ImportError를 하려고 할 때foo.py이 수입 에 대해 a.py )import b모듈 b가 없다고 합니다.럼럼 이걸 떻떻 떻? ?? ??? a로로 합니다.import mylib.b 된다a ★★★★★★★★★★★★★★★★★」b 다 있다mylib여기서의 솔루션(또는 적어도1개의 솔루션)은 절대 Import를 사용하는 것입니다.

from mylib import b

출처: Python: 모듈을 Import하는 모듈 Import

Python3는 urlib이었다.두 가지 양식이 모두 허용되며 어느 한 가지 형태의 Import가 다른 형식보다 선호되지 않습니다.되어 있는 는, 의 「 」 「 」 「 」 「 」 「 」 「 」 「 」 「 」를하는 경우가 있습니다.from x.y.z.a import s

패키지의 두은 urlib 입니다.import urllib.request urllib.request표준 라이브러리가 균일하게 사용하는 방법입니다.

2.에서는 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
>>>

urlib.request import에 대한 저의 주된 불만은 urlib.parse를 Import하지 않아도 참조할 수 있다는 것입니다.

>>> import urllib3.request
>>> urllib3.logging
<module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'>

또한 저를 위한 요청은 urlib3 아래에 있습니다.Python 2.7.4 우분투

언급URL : https://stackoverflow.com/questions/9439480/from-import-vs-import

반응형