за годы практики я очень разочаровался системой импорта python: она сложная и с ней трудно обращаться правильно. Кроме того, я должен поддерживать оценки импорта в каждом модуле, который я пишу, что является лаваш.
Пространства имен - очень хорошая идея, и они незаменимы - у php нет подходящих пространств имен, и это беспорядок.
концептуально, часть написания приложения состоит в определении подходящего словаря, слов, которые вы будете использовать, чтобы делать то, что вы хотите. все же классическим способом, именно эти слова не будут легкими, поскольку вы должны сначала импортировать это, импортировать это, чтобы получить доступ.
Когда пространства имен оказались в фокусе сообщества javascript, Джон Резиг из jquery fame решил, что предоставление единственной переменной $
в глобальном пространстве имен - это путь, который минимально повлияет на глобальное пространство имен и обеспечит легкий доступ ко всему с помощью jquery.
аналогично, я экспериментировал с глобальной переменной g
, и это работало до некоторой степени. в основном, у вас есть две опции: либо есть модуль запуска, который должен быть запущен до любого другого модуля в вашем приложении, который определяет, какие вещи должны быть доступны в g
, поэтому он готов к работе, когда это необходимо. другой подход, который я попробовал, состоял в том, чтобы сделать g
ленивым и реагировать на пользовательский импорт, когда требовалось новое имя; поэтому, когда вам понадобится g.foo.frob(42)
в первый раз, механизм попробует что-то вроде import foo; g.foo = foo
за кулисами. это было гораздо труднее сделать правильно.
В наши дни я почти полностью отключил систему импорта, за исключением стандартных библиотек и пакетов сайтов. Большую часть времени я пишу обертки для библиотек шлангов, так как 90% из них в любом случае имеют извилистые интерфейсы. те обертки, которые я затем публикую в глобальном пространстве имен, используя соглашения об орфографии, чтобы свести к минимуму риск коллизий.
Я говорю это только для того, чтобы смягчить впечатление, что изменение глобального пространства имен является чем-то изначально злым, что, как кажется, утверждают другие ответы. не так. зло состоит в том, чтобы делать это бездумно или быть вынужденным сделать это языком или дизайном упаковки.
позвольте мне добавить одно замечание, так как я почти наверняка получу некоторый пожар здесь: 99% всего импорта, сделанного людьми, которые религиозно защищают чистоту пространства имен, являются неправильными . доказательство? в первых строках вы прочтете любой модуль foo.py
, который должен выполнять тригонометрию, например, from math import sin
. теперь, когда вы правильно import foo
и посмотрите на это пространство имен, что вы собираетесь найти? что-то с именем foo.sin
. но это sin
не является частью интерфейса foo
, это просто помощник, оно не должно загромождать это пространство имен - следовательно, from math import sin as _sin
или что-то подобное было бы правильно. однако почти никто так не поступает.
Я уверен, что вы получите некоторые горячие комментарии с этими взглядами, так что продолжайте.