I'm bertanya-tanya jika ada's perbedaan antara fragmen kode
from urllib import request
dan fragmen
import urllib.request
atau jika mereka dipertukarkan. Jika mereka dipertukarkan, yang merupakan "s"/"pilihan" sintaks (jika ada)?
Terima kasih!!!
Hal ini tergantung pada bagaimana anda ingin mengakses impor ketika anda merujuk ke sana.
from urllib import request
# access request directly.
mine = request()
import urllib.request
# used as urllib.request
mine = urllib.request()
Anda juga dapat alias hal-hal diri sendiri ketika anda mengimpor untuk kesederhanaan atau untuk menghindari masking built in:
from os import open as open_
# lets you use os.open without destroying the
# built in open() which returns file handles.
Banyak orang sudah menjelaskan tentang impor
vs dari
, jadi saya ingin mencoba untuk menjelaskan sedikit lebih di bawah tenda, di mana perbedaan yang sebenarnya kebohongan.
Pertama-tama, mari saya jelaskan apa dasar impor pernyataan lakukan.
impor X
Impor modul
X
, dan menciptakan sebuah referensi untuk yang modul di saat ini namespace. Maka anda perlu untuk mendefinisikan modul selesai jalan untuk akses tertentu atribut atau metode dari dalam module (misalnya:X. nama
atauX. atribut
)
dari X impor *
Impor modul
X
, dan menciptakan referensi untuk semua benda publik didefinisikan oleh modul pada saat ini namespace (yaitu, segala sesuatu yang tidak memiliki nama yang dimulai dengan_
) atau apapun nama anda sebutkan.Atau, dengan kata lain, setelah anda've menjalankan pernyataan ini, anda hanya dapat menggunakan plain (wajar tanpa pengecualian) nama untuk merujuk pada hal-hal yang didefinisikan dalam modul
X
. TetapiX
itu sendiri tidak didefinisikan, sehinggaX. nama
doesn't bekerja. Dan jikanama
sudah ditetapkan, itu diganti dengan versi baru. Dan jika nama diX
adalah berubah untuk menunjuk ke beberapa objek lainnya, modul anda tidak akan melihat.Ini membuat semua nama-nama dari modul yang tersedia pada namespace lokal.
Sekarang mari's melihat apa yang terjadi ketika kita melakukan impor X. Y
:
>>> import sys
>>> import os.path
Periksa sys.modul
dengan nama os
dan os.jalan
:
>>> 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'>
Periksa globals()
dan setempat()
namespace dict dengan nama os
dan os.jalan
:
>>> 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'
>>>
Dari contoh di atas, kita menemukan bahwa hanya os
ditambahkan ke lokal dan global namespaces.
Jadi, kita harus bisa menggunakan 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'>
>>>
…tapi tidak path
:
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Setelah anda menghapus os
dari penduduk setempat()
namespace, anda memenangkan't dapat mengakses baik os
atau os.jalan
, meskipun mereka tidak ada dalam sys.modul
:
>>> 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
>>>
Sekarang mari's melihat dari
.
dari
>>> import sys
>>> from os import path
Periksa sys.modul
dengan nama os
dan os.jalan
:
>>> 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'>
Jadi sys.modul
terlihat sama seperti ketika kita diimpor menggunakan import nama
.
Oke. Let's periksa apa itu setempat()
dan globals()
namespace dicts terlihat seperti:
>>> 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'
>>>
Anda dapat mengakses dengan menggunakan jalan
, tapi tidak dengan os.jalan
:
>>> 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
>>>
Let's hapus 'jalan' dari penduduk setempat():
>>> del locals()['path']
>>> path
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'path' is not defined
>>>
Salah satu contoh terakhir menggunakan aliasing:
>>> 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'>
>>>
Dan tidak ada jalan yang ditetapkan:
>>> globals()['path']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'path'
>>>
dari
Ketika anda mengimpor sama nama
dari dua modul yang berbeda:
>>> import sys
>>> from os import stat
>>> locals()['stat']
<built-in function stat>
>>>
>>> stat
<built-in function stat>
Impor stat dari shutil
lagi:
>>>
>>> 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'>
>>>
TERAKHIR IMPOR AKAN MENANG
Ada perbedaan. Dalam beberapa kasus, salah satu dari mereka akan bekerja dan yang lain tidak't. Berikut ini sebuah contoh: katakanlah kita memiliki struktur sebagai berikut:
foo.py
mylib\
a.py
b.py
Sekarang, saya ingin mengimpor b.py
menjadi.py
. Dan saya ingin mengimpor a.py
untuk foo
. Bagaimana saya melakukan ini? Dua pernyataan, di a
saya menulis:
import b
Dalam foo.py
saya menulis:
import mylib.a
Nah, ini akan menghasilkan sebuah ImportError
ketika mencoba untuk menjalankan foo.py
. Interpreter akan mengeluh tentang pernyataan impor di a.py
(impor b
) mengatakan tidak ada modul b. Jadi bagaimana kita bisa memperbaiki hal ini? Dalam situasi seperti ini, mengubah pernyataan impor di a
untuk mengimpor mylib.b
tidak akan bekerja karena a
dan b
yang kedua di mylib
. Solusi di sini (atau setidaknya salah satu solusi) adalah dengan menggunakan mutlak impor:
from mylib import b
Sumber: https://stackoverflow.com/questions/16004076/python-importing-a-module-that-imports-a-module
Anda menggunakan Python3 yang urllib dalam paket. Kedua bentuk yang dapat diterima dan tidak ada satu bentuk impor lebih disukai daripada yang lain. Kadang-kadang ketika ada beberapa paket direktori terlibat anda dapat menggunakan mantan dari x.y.z.impor s
Dalam kasus khusus ini dengan urllib paket, cara kedua impor urllib.permintaan
dan menggunakan urllib.permintaan
adalah cara standar perpustakaan menggunakan seragam itu.
Di python 2.x setidaknya anda tidak bisa melakukan impor urllib2.urlopen
Yang harus anda lakukan dari urllib2 impor 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
>>>
Keluhan utama saya dengan impor urllib.permintaan adalah bahwa anda masih dapat referensi urllib.mengurai meskipun itu bukan't impor.
>>> import urllib3.request
>>> urllib3.logging
<module 'logging' from '/usr/lib/python2.7/logging/__init__.pyc'>
Juga permintaan untuk saya adalah di bawah urllib3. Python 2.7.4 ubuntu