Найти - Пользователи
Полная версия: the import statement
Начало » Python для новичков » the import statement
1
FILLIPO
Здравствуйте, у меня сегодня день откровений, но обо всем по порядку:

Python 3.2.3 (default, Apr 12 2012, 21:55:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> from urllib import request
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'error', 'parse', 'request', 'response']
>>> 
я не понимаю, как в этом случае работает import. Поиск с пристрастием по всем элементам из dir(urllib) показал, что элемента request ни в одном из них нет. Тем не менее, from urllib import request не только вытягивает в глобальное пространство имен dir() этот самый request, но и магическим образом добавляет в dir(urllib) еще error, parse, request и response. Хорошо, смирившись с этим залез в /usr/lib/python3.2/urllib и посмотрел содержимое __init__.py, который оказался пустым. Ладно, стал искать файл urllib.py и тут был сурово удивлен: его в директории не оказалось. Товарищи, но ведь я в интерпретаторе написал, что импортирую именно urllib, а его в директории нет, как так? Видимо, чтобы совершенно меня добить, в этой же многострадальной директории нахально лежали error.py, response.py, request.py и parse.py (вместе с robotparser.py и поддиректорией __pycache__, но это, как я понимаю, не важно). И как все это понимать?
Если моя мысль еще не ясна, изображу контрпример, в котором работа import мне понятна
Python 3.2.3 (default, Apr 12 2012, 21:55:50) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']
>>> from math import sqrt
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'math', 'sqrt']
>>> 
вот здесь я понимаю: dir(math) показывает, какими функциями богат модуль, а from math import sqrt выносит функцию sqrt в global namespace и избавляет меня от адресования к этой функции по имени модуля.
Так вот, подытожу вопросы:
1) где в модуле urllib скрываются request, response, parse и error?
2) где скрывается сам urllib.py? (locate urllib.py выдает, кроме прочего неважного, /usr/lib/python3.2/lib2to3/fixes/fix_urllib.py, что не подходит)
3) почему при from urllib import request в сам urllib добавляются еще parse, error и response? почему об этом побочном эффекте ничего нет в __init__.py? (хотя что-то мне подсказывает, что __init__.py за это не в ответе. Тогда что отвечает за такое поведение?)

Всем, кто дочитал и осознал, чего я хочу, спасибо и на этом. Google не помог, потому что адекватный поисковый запрос я сформулировать не смог, хоть и пытался.
P.S. здесь давно не был, но то, что авторизация на форуме теперь привязана в том числе и к Google, позволило даже не вспоминать логин/пароль. Это классно, спасибо!
s0rg
>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> urllib.__dict__['__file__']
'/usr/lib/python3.2/urllib/__init__.py'
ls /usr/lib/python3.2/urllib/
error.py  __init__.py  parse.py  __pycache__/  request.py  response.py  robotparser.py
О чудо! request.py найден!!!
FILLIPO
FILLIPO
Видимо, чтобы совершенно меня добить, в этой же многострадальной директории нахально лежали error.py, response.py, request.py и parse.py
да - да, но я искал не request.py в файловой директории (выше цитата, из которой ясно, что его-то я нашел), а элемент request модуля urllib в пространстве имен самого модуля. В файловой директории я хотел бы найти файл urllib.py, который я импортирую комадой import urllib.
еще раз:
1) где в пространстве имен модуля urllib лежат элементы request, response, parse и error?
2) где в файловой директории лежит файл urllib.py, который я импортирую командой import urllib? (или я этой командой импортирую целиком всю директорию /usr/lib/python3.2/urllib ?)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB