Есть ли в Python что-то вроде ключевого слова using в C++?

StackOverflow https://stackoverflow.com/questions/550148

  •  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()

В дополнение к ответу Дэвида:

  1. В тексте следует использовать круглые скобки. from X import (foo, bar, blah) ради ПЭП8.
  2. Полный синтаксис позволяет переименовывать (перепривязывать) имена пакетов к их новым идентификаторам в пределах текущего модуля, как в 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 пришли из.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top