Python (и Django) лучше всего импортирует методы

Я всегда использую быструю вставку - перетаскивают выбор в emacs, нажимают среднюю кнопку мыши в целевом окне.

(От ссылки до kate, я беру его, Вы находитесь на Linux или подобны и вероятно использующий emacs в X так или иначе.)

21
задан CharlesB 25 February 2013 в 15:24
поделиться

3 ответа

Для меня это зависит от ситуации. Если это метод / класс с уникальным именем (т.е. не 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

5
ответ дан 29 November 2019 в 21:54
поделиться

Первое и основное правило импорта: никогда не используйте 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
13
ответ дан 29 November 2019 в 21:54
поделиться

Преимущество последнего в том, что источник MyClass больше явный. Первый помещает MyClass в текущее пространство имен, поэтому код может просто использовать MyClass без ограничений. Так что это менее очевидно для тех, кто читает код, в котором определен MyClass.

2
ответ дан 29 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: