Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2009 01:03:07

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

Приятного аппетита всем…

Есть пакет с модулем name в котором есть объект name. Мне нужно получить объект без явного обращения к модулю. Криво написал… Так будет понятнее:

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

P.S. Это далеко не первая проблема разрешения имён… Не очень-то по принципу наименьшего удивления.



Отредактировано (Авг. 9, 2009 02:31:25)

Офлайн

#2 Авг. 9, 2009 02:42:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

from package.name import name?
Или я чего то не понял? И где нарушается принцип наименьшего удивления? Что спросил - то и получил.



Офлайн

#3 Авг. 9, 2009 03:47:53

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

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

А принцип наименьшего удивления… Я был очень удивлён, увидев модуль name вместо объекта, когда к конструкторе пакета я импортировал объект.



Офлайн

#4 Авг. 9, 2009 09:51:02

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

:-)

from package import get_name
get_name()
from package import * – должен работать как ты хочешь, а вот…
from package import name – работать не будет.

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

..bw



Офлайн

#5 Авг. 9, 2009 16:44:09

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

:-)

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

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

Спасибо!



Офлайн

#6 Авг. 9, 2009 17:55:48

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

Видимо я не понял задачи, так как у меня всё работает (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



Отредактировано (Авг. 9, 2009 17:58:04)

Офлайн

#7 Авг. 9, 2009 18:22:41

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Казус одинаковых имён.

Так… Приехали… Ты правильно понял задачу. Python 2.6.1 – твой пример работает.
Полез чуть дальше… Это эклипс! Просто с консоли всё нормально, а в эклипсине импортируется модулем!
Полез ещё дальше… Дело в том, что у меня а эклипсе есть “External Tool”, который запускает “nosetests -vs –with-doctest” в папке с текущим проектом. Так вот, если я убираю “–with-doctest”, то всё работает правильно. Так что эклипс не причём.
С одной стороны, я доктесты не часто использую, а с другой глюк неприятный. По-меньше бы такой магии…

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

P.S.

$ nosetests -V
nosetests version 0.11.0



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version