Я всегда использую быструю вставку - перетаскивают выбор в emacs, нажимают среднюю кнопку мыши в целевом окне.
(От ссылки до kate, я беру его, Вы находитесь на Linux или подобны и вероятно использующий emacs в X так или иначе.)
Для меня это зависит от ситуации. Если это метод / класс с уникальным именем (т.е. не process ()
или что-то в этом роде), и вы собираетесь использовать его как лот , то сохраните ввод и просто выполните из foo импортировать MyClass
.
Если вы импортируете несколько вещей из одного модуля, вероятно, лучше просто импортировать модуль и сделать module.bar, module.foo, module.baz
и т. Д., Чтобы сохранить пространство имен clean.
Вы также сказали
Было сказано, что эта форма помогает избежать циклических ошибок импорта или, по крайней мере, делает систему импорта django менее уязвимой. Было отмечено, что собственный код Django, похоже, предпочитает "from x import y" над "import x".
Я не Я не вижу, как тот или иной способ поможет предотвратить циклический импорт. Причина в том, что даже когда вы выполняете из x import y
, ВСЕ из x
импортируются. Только y
переносится в текущее пространство имен, но обрабатывается весь модуль x
. Попробуйте этот пример:
В test.py введите следующее:
def a():
print "a"
print "hi"
def b():
print "b"
print "bye"
Затем в 'runme.py' введите:
from test import b
b()
Затем просто выполните python runme.py
Вы увидите следующий вывод:
hi
bye
b
Итак, все в test.py было запущено, даже если вы импортировали только b
Первое и основное правило импорта: никогда не используйте from foo import *
.
В статье обсуждается проблема циклического импорта, которая существует и сегодня в плохо структурированном коде. Я не люблю цикличный импорт; их присутствие - верный признак того, что какой-то модуль делает слишком много и его нужно разделить. Если по какой-либо причине вам необходимо работать с кодом с циклическим импортом, который не может быть переупорядочен, единственный вариант - import foo
.
В большинстве случаев нет большой разницы между import foo
и из foo импортируют MyClass
. Я предпочитаю второй, потому что там меньше набора текста, но есть несколько причин, по которым я могу использовать первое:
Модуль и класс / значение имеют разные имена. Читателям может быть трудно запомнить, откуда исходит конкретный импорт, когда имя импортируемого значения не связано с модулем.
import myapp.utils as utils; utils.frobnicate ()
импортировать myapp.utils как U; U.frobnicate ()
from myapp.utils import frobnicate
Вы импортируете много значений из одного модуля. Сохраните свои пальцы и глаза читателя.
from myapp.utils import frobnicate, foo, bar, baz, MyClass, SomeOtherClass, # yada yada
Преимущество последнего в том, что источник MyClass больше явный. Первый помещает MyClass в текущее пространство имен, поэтому код может просто использовать MyClass без ограничений. Так что это менее очевидно для тех, кто читает код, в котором определен MyClass.