Есть ли в Python что-то вроде ключевого слова using в C++?
-
23-08-2019 - |
Вопрос
В C++ вы часто можете значительно улучшить читабельность вашего кода, осторожно используя ключевое слово «using», например:
void foo()
{
std::vector< std::map <int, std::string> > crazyVector;
std::cout << crazyVector[0].begin()->first;
}
становится
void foo()
{
using namespace std; // limited in scope to foo
vector< map <int, string> > crazyVector;
cout << crazyVector[0].begin()->first;
}
Существует ли что-то подобное для Python, или мне нужно все полностью квалифицировать?
Я добавлю заявление об отказе от ответственности: я знаю, что использование имеет свои подводные камни и его объем должен быть соответствующим образом ограничен.
Решение
Как сказал Билл, в Python есть конструкция
from X import *
но вы также можете явно указать, какие имена вы хотите импортировать из модуля (пространства имен):
from X import foo, bar, blah
Это делает код еще более читабельным/простым для понимания, поскольку тому, кто видит идентификатор в источнике, не нужно просматривать все импортированные модули, чтобы узнать, откуда он взялся.Вот связанный вопрос: Спецификация пространства имен без двусмысленности
РЕДАКТИРОВАТЬ:в ответ на комментарий Пакса отмечу, что вы также можете писать такие вещи, как
import X.foo
но тогда тебе нужно будет написать
X.foo.moo()
вместо того, чтобы просто
foo.moo()
Конечно, это не обязательно плохо.Обычно я использую смесь from X import y
и import X.y
формы, все, что я чувствую, делает мой код максимально понятным.Это, конечно, в какой-то степени субъективная вещь.
Другие советы
import X
или
from X import *
или
from X import a, b, c
Где X — модуль Python, который вы хотите использовать.
Было бы полезно, если бы вы предоставили нам образец кода Python, который, по вашему мнению, нуждается в доработке.
Конечно, динамизм Python делает это тривиальным.Если у вас есть класс, спрятанный глубоко в пространстве имен:foo.bar.baz.blah, вы можете сделать:
def foo:
f = foo.bar.baz.blah
f1 = f()
В дополнение к ответу Дэвида:
- В тексте следует использовать круглые скобки.
from X import (foo, bar, blah)
ради ПЭП8. - Полный синтаксис позволяет переименовывать (перепривязывать) имена пакетов к их новым идентификаторам в пределах текущего модуля, как в
from foo import bar as baz
.
Рекомендую поискать инструкцию к импортировать ключевое слово, __import__
встроенный и объяснение sys.modules как дальнейшее чтение.
Другой вариант в Python — конструкция «as» при импорте.Например:
from foo import bar as baz
Это принесет foo.bar
в качестве baz
в текущем модуле, что позволяет объекту получить другое имя в текущем модуле, возможно, чтобы избежать сокрытия существующего объекта с тем же именем в текущем модуле.
Обратите внимание, что
from foo import bar
работает, даже если bar
это модуль в foo
упаковка.Это позволяет вам ограничить загрязнение пространства имен без необходимости называть каждую функцию/класс в foo.bar
которые вы, возможно, захотите использовать.Это также поможет читателям вашего кода, поскольку они увидят вызов bar.baz()
и иметь лучшее представление о том, где baz
пришли из.