Найти - Пользователи
Полная версия: Казус одинаковых имён.
Начало » Python для экспертов » Казус одинаковых имён.
1
ZZZ
Приятного аппетита всем…

Есть пакет с модулем name в котором есть объект name. Мне нужно получить объект без явного обращения к модулю. Криво написал… Так будет понятнее:
>>> from package import name
>>> name
'объект name в модуле package.name'
Проблема заключается в одинаковости имён модуля и объекта.
В конструкторе пакета я пишу "from name import name", но никакого видимого эффекта это не даёт – получаемый при импорте из пакета объект есть модуль name.
Можно, конечно, переименовать модуль и, наверное, так и сделаю… Но тогда теряется вся стройность пакета. Хотелось бы сохранить как есть. Это возможно?

P.S. Это далеко не первая проблема разрешения имён… Не очень-то по принципу наименьшего удивления.
Андрей Светлов
from package.name import name?
Или я чего то не понял? И где нарушается принцип наименьшего удивления? Что спросил - то и получил.
ZZZ
Ещё раз.
Я в конструкторе пакета импортирую список объектов. В том числе и объект name из модуля name. По идее там же есть и список __all__ в котором есть этот name… Но это уже частности.
Я знаю, как получить нужный мне объект. Например просто name.name или как предложили вы. Оно элементарно. Но я хочу удобство использования “from package import *”.
Это больше академический интерес… Но просто интересно, может я чего не уловил.

А принцип наименьшего удивления… Я был очень удивлён, увидев модуль name вместо объекта, когда к конструкторе пакета я импортировал объект.
bw
:-)
from package import get_name
get_name()
from package import * – должен работать как ты хочешь, а вот…
from package import name – работать не будет.

Ничего сделать нельзя. Может только хук на импорт повесить.

..bw
ZZZ
:-)

bw
from package import * – должен работать как ты хочешь
– Робот класса “Буратино” нырять не может!
– Не может, а ныряет.
Что я там про принцип наименьшего удивления? Я сначала так и написал… А потом тест мне сказал, что модуль, блин, вызываться не может и не пошёл бы я с такими запросами к дядюшке Аиду…

bw
Может только хук на импорт повесить.
Ну это уже всё равно, что скальпелем дрова рубить… Ладно, переименовал модуль из красивого “to_pickle” в некрасивое “topickle” и фиг с ним.

Спасибо!
bw
Видимо я не понял задачи, так как у меня всё работает (Python 2.5.2).

foo/__init__.py:
import bar                                                                                                              
bar = bar.bar
foo/bar.py:
bar = 'bar'
Тест #1:
>>> from foo import bar
>>> bar
'bar'
Тест #2:
>>> from foo import *
>>> bar
'bar'
..bw
ZZZ
Так… Приехали… Ты правильно понял задачу. Python 2.6.1 – твой пример работает.
Полез чуть дальше… Это эклипс! Просто с консоли всё нормально, а в эклипсине импортируется модулем!
Полез ещё дальше… Дело в том, что у меня а эклипсе есть “External Tool”, который запускает “nosetests -vs –with-doctest” в папке с текущим проектом. Так вот, если я убираю “–with-doctest”, то всё работает правильно. Так что эклипс не причём.
С одной стороны, я доктесты не часто использую, а с другой глюк неприятный. По-меньше бы такой магии…

Ещё раз спасибо!

P.S.
$ nosetests -V
nosetests version 0.11.0
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