В вычислениях , A пространство имена представляет собой набор знаков ( имена ), которые используются для идентификации и относятся к объектам различных видов. Пространство имен гарантирует, что весь данный набор объектов имеет уникальные имена, чтобы их можно было легко идентифицировать .
Пространства имен обычно структурированы как иерархии, что позволяет повторно использовать имена в разных контекстах. В качестве аналогии рассмотрим систему именования людей, в которой каждый человек имеет свое имя, а также фамилию, совместно используемую их родственниками. Если имена членов семьи уникальны только в пределах каждой семьи, то каждого человека можно однозначно идентифицировать по комбинации имени и фамилии; есть только одна Джейн Доу, хотя Джейн может быть много. В пространстве имен семейства Доу достаточно просто «Джейн», чтобы однозначно обозначить этого человека, в то время как в «глобальном» пространстве имен всех людей должно использоваться полное имя.
Яркие примеры пространств имен включают файловые системы , которые присваивают имена файлам. [1] Некоторые языки программирования организуют свои переменные и подпрограммы в пространствах имен. [2] [3] [4] Компьютерные сети и распределенные системы присваивают имена ресурсам, таким как компьютеры, принтеры, веб-сайты и удаленные файлы. Операционные системы могут разделять ресурсы ядра по изолированным пространствам имен для поддержки контейнеров виртуализации .
Аналогичным образом иерархические файловые системы организуют файлы в каталогах. Каждый каталог представляет собой отдельное пространство имен, так что каталоги «письма» и «счета-фактуры» могут содержать файл «to_jane».
В компьютерном программировании пространства имен обычно используются с целью группировки символов и идентификаторов вокруг определенной функциональности и во избежание конфликтов имен между несколькими идентификаторами, которые имеют одно и то же имя.
В сети система доменных имен организует веб-сайты (и другие ресурсы) в иерархические пространства имен .
Конфликты имен [ править ]
Имена элементов определяются разработчиком. Это часто приводит к конфликту при попытке смешать XML-документы из разных XML-приложений.
Этот XML-код содержит информацию таблицы HTML :
<table> <tr> <td> Яблоки </td> <td> Апельсины </td> </tr> </table>
Этот XML-код содержит информацию о таблице (т. Е. О предмете мебели):
<table> <name> Африканский журнальный столик </name> <width> 80 </width> <length> 120 </length> </table>
Если бы эти фрагменты XML были сложены вместе, возник бы конфликт имен. Оба содержат <table>...</table>
элемент, но имеют разное содержание и значение.
Анализатор XML не знает, как обрабатывать эти различия.
Решение через префикс [ править ]
Конфликтов имен в XML можно легко избежать с помощью префикса имени.
Следующий XML-код различает информацию о HTML-таблице и мебели с помощью префиксов «h» и «f» в начале элементов.
<h: table> <h: tr> <h: td> Яблоки </ h: td> <h: td> Апельсины </ h: td> </ h: tr> </ h: table><f: table> <f: name> Африканский журнальный столик </ f: name> <f: width> 80 </ f: width> <f: length> 120 </ f: length> </ f: table>
Система имен [ править ]
Имя в пространстве имен состоит из идентификатора пространства имен и локального имени. [5] [6] Имя пространства имен обычно применяется как префикс к локальному имени.
В расширенной форме Бэкуса – Наура :
name = <идентификатор пространства имен> разделитель <локальное имя>
Когда локальные имена используются сами по себе, разрешение имен используется, чтобы решить, какое (если есть) конкретное имя упоминается в каком-то конкретном локальном имени.
Примеры [ править ]
Контекст | Имя | Идентификатор пространства имен | Местное название | |
---|---|---|---|---|
Дорожка | /home/user/readme.txt | readme.txt (имя файла) | ||
Доменное имя | www.example.com | www (конечное доменное имя) | ||
C ++ | std :: array | множество | ||
ООН / ЛОКОД | США, Нью-Йорк | Нью-Йорк (город) | ||
XML | xmlns: xhtml = " http://www.w3.org/1999/xhtml " <xhtml: body> | тело | ||
Perl | $ DBI :: errstr | $ errstr | ||
Ява | java.util.Date | Дата | ||
Единое имя ресурса (URN) | урна: nbn: fi-fe19991055 | urn: nbn (номера национальной библиографии) | fi-fe19991055 | |
Система ручки | 10,1000 / 182 | 10 (дескриптор именования) | 1000/182 (обрабатывать локальное имя) | |
Идентификатор цифрового объекта | 10,1000 / 182 | 10.1000 (издатель) | 182 (публикация) | |
MAC-адрес | 01-23-45-67-89-ab | 01-23-45 ( уникальный идентификатор организации ) | 67-89-ab (зависит от сетевой карты) | |
PCI ID | 1234 abcd | 1234 (идентификатор поставщика) | abcd (идентификатор устройства) | |
USB VID / PID | 2341 003f [7] | 2341 (идентификатор поставщика) | 003f (идентификатор продукта) | |
SPARQL | dbr: Сидней | dbr (ранее объявленная онтология, например, указав @prefix dbr: < http://dbpedia.org/resource/ >) | Сидней |
Делегирование [ править ]
Делегирование ответственности между сторонами важно в реальных приложениях, таких как структура Всемирной паутины. Пространства имен позволяют делегировать назначение идентификаторов нескольким организациям, выдающим имена, при сохранении глобальной уникальности. [8] Центральный орган регистрации регистрирует назначенные идентификаторы выделенного пространства имен . Каждый идентификатор пространства имен назначается организации, которая впоследствии отвечает за присвоение имен в выделенном им пространстве имен. Эта организация может быть организацией, выдающей имена , которая присваивает сами имена , или другим органом регистрации, который в дальнейшем делегирует части своего пространства имен различным организациям.
Иерархия[ редактировать ]
Схема именования, которая позволяет подчинять пространства имен третьим сторонам, представляет собой иерархическое пространство имен .
Иерархия является рекурсивной, если синтаксис идентификаторов пространства имен одинаков для каждого подделегирования. Примером рекурсивной иерархии является система доменных имен .
Примером нерекурсивной иерархии является унифицированное имя ресурса, представляющее номер службы присвоения номеров в Интернете (IANA).
Реестр | Регистратор | Пример идентификатора | Идентификатор пространства имен | Пространство имен |
---|---|---|---|---|
Единое имя ресурса (URN) | Управление по присвоению номеров в Интернете | урна: isbn: 978-3-16-148410-0 | урна | Формальное пространство имен URN |
Формальное пространство имен URN | Управление по присвоению номеров в Интернете | урна: isbn: 978-3-16-148410-0 | ISBN | Международные стандартные номера книг как универсальные названия ресурсов |
Международный номер артикула (EAN) | GS1 | 978-3-16-148410-0 | 978 | Bookland |
Международный стандартный номер книги (ISBN) | Международное агентство ISBN | 3-16-148410-X | 3 | Немецкоговорящие страны |
Код немецкого издателя | Agentur für Buchmarktstandards | 3-16-148410-X | 16 | Мор Зибек |
Пространство имен против области [ править ]
Идентификатор пространства имен может обеспечивать контекст ( область в информатике) для имени, и термины иногда используются как взаимозаменяемые. Однако контекст имени также может быть обеспечен другими факторами, такими как место, где оно встречается, или синтаксис имени.
Без пространства имен | С пространством имен | |
---|---|---|
Локальный охват | Номерной знак автомобиля | Стандарт иерархии файловой системы |
Глобальный охват | Универсальный уникальный идентификатор | система доменных имен |
На языках программирования [ править ]
Для многих языков программирования пространство имен является контекстом для их идентификаторов . В операционной системе примером пространства имен является каталог. Каждое имя в каталоге однозначно идентифицирует один файл или подкаталог. [9]
Как правило, имена в пространстве имен не могут иметь более одного значения; то есть разные значения не могут иметь одно и то же имя в одном и том же пространстве имен. Пространство имен также называется контекстом , потому что одно и то же имя в разных пространствах имен может иметь разные значения, каждое из которых соответствует своему пространству имен.
Ниже приведены другие характеристики пространств имен:
- Имена в пространстве имен могут представлять объекты, а также концепцию , быть в пространстве имен с естественным или этническим языком , а сконструированный язык , в техническую терминологии по профессии, на диалект , а социолект , или язык искусственного (например, язык программирования ).
- В языке программирования Java идентификаторы, которые появляются в пространствах имен, имеют короткое (локальное) имя и уникальное длинное «квалифицированное» имя для использования вне пространства имен.
- Некоторые компиляторы (для таких языков, как C ++ ) объединяют пространства имен и имена для внутреннего использования в компиляторе в процессе, называемом преобразованием имен .
Помимо технического использования абстрактного языка, как описано выше, в некоторых языках есть конкретное ключевое слово, используемое, помимо прочего, для явного управления пространством имен. Ниже приведен пример пространства имен в C ++:
#include <iostream>// Вот как можно добавить имя в текущую область видимости. В этом случае он // переносит их в глобальную область видимости. используя std :: cout ; используя std :: endl ;пространство имен box1 { int box_side = 4 ; }пространство имен box2 { int box_side = 12 ; }int main () { int box_side = 42 ; соиЬ << box1 :: box_side << епсИ ; // Выведет 4. соиЬ << box2 :: box_side << епсИ ; // Выведет 12. соиЬ << box_side << епсИ ; // Выводит 42. }
Соображения по информатике [ править ]
Пространство имен в информатике (иногда также называемое областью имен ) - это абстрактный контейнер или среда, созданная для хранения логической группы уникальных идентификаторов или символов (т. Е. Имен). Идентификатор, определенный в пространстве имен, связан только с этим пространством имен. Один и тот же идентификатор может быть независимо определен в нескольких пространствах имен. То есть идентификатор, определенный в одном пространстве имен, может иметь или не иметь то же значение, что и тот же идентификатор, определенный в другом пространстве имен. Языки, поддерживающие пространства имен, определяют правила, определяющие, какому пространству имен принадлежит идентификатор (а не его определение). [10]
Эту концепцию можно проиллюстрировать аналогией. Представьте, что две компании, X и Y, присваивают своим сотрудникам идентификационные номера. У X не должно быть двух сотрудников с одинаковым идентификационным номером, как и у Y; но использование одного и того же идентификационного номера в обеих компаниях не является проблемой. Например, если Билл работает в компании X, а Джейн работает в компании Y, то для каждого из них не проблема быть сотрудником № 123. В этой аналогии идентификационный номер является идентификатором, а компания - пространством имен. Это не вызывает проблем, если один и тот же идентификатор идентифицирует разных людей в каждом пространстве имен.
В больших компьютерных программах или документах обычно используются сотни или тысячи идентификаторов. Пространства имен (или аналогичный метод, см. Эмуляция пространств имен ) предоставляют механизм для сокрытия локальных идентификаторов. Они предоставляют средства группировки логически связанных идентификаторов в соответствующие пространства имен, тем самым делая систему более модульной .
Устройства хранения данных и многие современные языки программирования поддерживают пространства имен. Устройства хранения используют каталоги (или папки) в качестве пространств имен. Это позволяет хранить на устройстве два файла с одинаковым именем, если они хранятся в разных каталогах. В некоторых языках программирования (например, C ++ , Python ) идентификаторы именования пространств имен сами связаны с охватывающим пространством имен. Таким образом, в этих языках пространства имен могут вкладываться, образуя дерево пространств имен . В корне этого дерева находится безымянное глобальное пространство имен .
Использовать на общих языках [ править ]
- C
Можно использовать анонимные в качестве пространств имен структур в C начиная с С99 .
// helper.c static int _add ( int a , int b ) { return a + b ; }const struct { двойной пи ; интервал ( * добавить ) ( интервал , интервал ); } помощник = { 3.14 , _add };// helper.h const struct { double pi ; интервал ( * добавить ) ( интервал , интервал ); } помощник ;// main.c #include <stdio.h>#include "helper.h"int main () { printf ( "3 + 2 =% d \ n " , помощник . добавить ( 3 , 2 )); printf ( "пи - это% f \ n " , помощник . пи ); }
- C ++
В C ++ пространство имен определяется с помощью блока пространства имен. [11]
пространство имен abc { int bar ; }
Внутри этого блока идентификаторы могут использоваться точно так, как они объявлены. Вне этого блока спецификатор пространства имен должен иметь префикс. Например, за пределами namespace abc
, bar
необходимо написать, abc::bar
чтобы получить доступ. В C ++ есть еще одна конструкция, которая делает ненужным многословие. Добавив строку
используя пространство имен abc ;
к фрагменту кода префикс abc::
больше не нужен.
Идентификаторы, которые явно не объявлены в пространстве имен, считаются находящимися в глобальном пространстве имен.
int foo ;
Эти идентификаторы могут использоваться точно так, как они объявлены, или, поскольку глобальное пространство имен не имеет имени, спецификатор пространства имен ::
может иметь префикс. Например, foo
также можно написать ::foo
.
Разрешение пространства имен в C ++ является иерархическим. Это означает, что в гипотетическом пространстве имен food::soup
идентификатор chicken
ссылается на food::soup::chicken
. Если food::soup::chicken
не существует, то это относится к food::chicken
. Если ни один, food::soup::chicken
ни food::chicken
существует, chicken
относится к ::chicken
идентификатору в глобальном пространстве имен.
Пространства имен в C ++ чаще всего используются, чтобы избежать конфликтов имен . Хотя пространства имен широко используются в недавнем коде C ++, большая часть старого кода не использует эту возможность, потому что ее не было в ранних версиях языка. Например, вся стандартная библиотека C ++ определена внутри namespace std
, но до стандартизации многие компоненты изначально находились в глобальном пространстве имен. Программист может вставить using
директиву, чтобы обойти требования разрешения пространства имен и получить обратную совместимость со старым кодом, который ожидает, что все идентификаторы будут в глобальном пространстве имен. Однако использование using
директивы по причинам, отличным от обратной совместимости (например, для удобства), считается противоречащим хорошей практике кода.
- Ява
В Java идея пространства имен воплощена в пакетах Java . Весь код принадлежит пакету, хотя этот пакет не требует явного имени. Доступ к коду из других пакетов осуществляется путем добавления префикса к имени пакета перед соответствующим идентификатором, например, может называться class String
in (это известно как полное имя класса ). Как и C ++, Java предлагает конструкцию, которая избавляет от необходимости вводить имя пакета ( ). Однако некоторые функции (например, отражение ) требуют, чтобы программист использовал полное имя.package java.lang
java.lang.String
import
В отличие от C ++, пространства имен в Java не являются иерархическими в том, что касается синтаксиса языка. Однако пакеты именуются иерархически. Например, все пакеты, начинающиеся с, java
являются частью платформы Java - пакет java.lang
содержит основные классы языка и java.lang.reflect
основные классы, специально относящиеся к отражению.
В Java (и Ada , C # и других) пространства имен / пакеты выражают семантические категории кода. Например, в C # namespace System
содержит код, предоставленный системой ( .NET Framework ). Насколько специфичны эти категории и насколько глубока иерархия, от языка к языку различается.
Функция и класс области можно рассматривать как неявные пространства имен, которые неразрывно связаны с видимостью, доступностью и жизнью объекта .
- C #
Пространства имен широко используются в языке C #. Все классы .NET Framework организованы в пространства имен для более четкого использования и во избежание хаоса. Более того, настраиваемые пространства имен широко используются программистами как для организации своей работы, так и для предотвращения конфликтов имен . При ссылке на класс следует указать либо его полное имя, что означает пространство имен, за которым следует имя класса,
Система . Консоль . WriteLine ( «Привет, мир!» ); int i = System . Конвертировать . ToInt32 ( «123» );
или добавьте оператор using . Это избавляет от необходимости упоминать полное имя всех классов в этом пространстве имен.
используя Систему ;Консоль . WriteLine ( «Привет, мир!» ); int i = преобразовать . ToInt32 ( «123» );
В приведенных выше примерах System - это пространство имен, а Console и Convert - классы, определенные в System .
- Python
В Python пространства имен определяются отдельными модулями, и, поскольку модули могут содержаться в иерархических пакетах, пространства имен также являются иерархическими. [12] [13] Обычно, когда модуль импортируется, имена, определенные в модуле, определяются через пространство имен этого модуля, и доступ к ним осуществляется из вызывающих модулей с использованием полного имени.
# предполагаем, что modulea определяет две функции: func1 () и func2 () и один класс: Class1 import ModuleaModulea . func1 () Modulea . func2 () a = Modulea . Класс1 ()
Этот from ... import ...
оператор можно использовать для вставки соответствующих имен непосредственно в пространство имен вызывающего модуля, и к этим именам можно получить доступ из вызывающего модуля без уточненного имени:
# предполагаем, что Modulea определяет две функции: func1 () и func2 () и один класс: Class1 из Modulea import func1func1 () func2 () # это не сработает как неопределенное имя, как и полное имя Modulea.func2 () a = Class1 () # это не сработает как неопределенное имя, как и полное имя Modulea.Class1 ()
Поскольку это напрямую импортирует имена (без уточнения), он может перезаписывать существующие имена без предупреждений.
Специальная форма оператора - from ... import *
это импорт всех имен, определенных в названном пакете, непосредственно в пространство имен вызывающего модуля. Использование этой формы импорта, хотя и поддерживается в языке, обычно не рекомендуется, поскольку она загрязняет пространство имен вызывающего модуля и приводит к перезаписи уже определенных имен в случае конфликта имен. [14]
Python также поддерживает import x as y
как способ предоставления псевдонима или альтернативного имени для использования вызывающим модулем:
импортировать numpy как npа = нп . апельсин ( 1000 )
- Пространство имен XML
В XML спецификация пространства имен XML позволяет именам элементов и атрибутов в документе XML быть уникальными, подобно роли пространств имен в языках программирования. Используя пространства имен XML, документы XML могут содержать имена элементов или атрибутов из более чем одного словаря XML.
- PHP
Пространства имен были введены в PHP начиная с версии 5.3. Можно избежать конфликта имен классов, функций и переменных. В PHP пространство имен определяется блоком пространства имен.
# Файл phpstar / foobar.phpпространство имен phpstar ;class FooBar { публичная функция foo () : void { echo 'Привет, мир, из функции foo' ; } публичная функциональная панель () : void { echo 'Привет, мир, из функциональной панели' ; } }
Мы можем ссылаться на пространство имен PHP следующими способами:
# Файл index.php# Включите файл include "phpstar / foobar.php" ;# Вариант 1. Прямой префикс имени класса с пространством имен $ obj_foobar = new \ phpstar \ FooBar ();# Вариант 2: импортировать пространство имен с помощью phpstar \ FooBar ; $ obj_foobar = новый FooBar ();# Вариант 2а: импорт и псевдоним пространства имен использовать phpstar \ FooBar как FB ; $ obj_foobar = новый FB ();# Доступ к свойствам и методам обычным способом $ obj_foobar -> foo (); $ obj_foobar -> bar ();
Эмуляция пространств имен [ править ]
В языках программирования, в которых отсутствует языковая поддержка пространств имен, пространства имен можно до некоторой степени эмулировать, используя соглашение об именах идентификаторов . Например, библиотеки C, такие как libpng, часто используют фиксированный префикс для всех функций и переменных, которые являются частью их открытого интерфейса. Libpng предоставляет такие идентификаторы, как:
png_create_write_structpng_get_signaturepng_read_rowpng_set_invalid
Это соглашение об именах обеспечивает разумную уверенность в том, что идентификаторы уникальны и, следовательно, могут использоваться в более крупных программах без конфликтов имен . [15] Аналогичным образом, многие пакеты, изначально написанные на Фортране (например, BLAS , LAPACK ), резервируют первые несколько букв имени функции, чтобы указать, к какой группе она принадлежит.
У этой техники есть несколько недостатков:
- Он плохо масштабируется для вложенных пространств имен; идентификаторы становятся чрезмерно длинными, так как все использования идентификаторов должны быть полностью квалифицированы пространством имен .
- Отдельные лица или организации могут использовать несогласованные соглашения об именах, что может привести к нежелательной обфускации.
- Составные или «основанные на запросе» операции с группами идентификаторов, основанные на пространствах имен, в которых они объявлены, оказываются громоздкими или невыполнимыми.
- В языках с ограниченной длиной идентификатора использование префиксов ограничивает количество символов, которые могут использоваться для определения того, что делает функция. Это особая проблема для пакетов, изначально написанных на FORTRAN 77 , который предлагал только 6 символов на идентификатор. Например, имя функции функции BLAS
DGEMM
указывает, что она работает с числами двойной точности («D») и общими матрицами («GE»), и только последние два символа показывают, что она на самом деле делает: умножение матрицы на матрицу ( «ММ»).
Есть несколько преимуществ:
- Для поиска имен в файлах исходного кода не требуется никаких специальных программных средств. Достаточно простой программы, такой как grep .
- Нет конфликтов имен пространств имен.
- Нет необходимости изменять имена и, следовательно, нет проблем с потенциальной несовместимостью.
См. Также [ править ]
Найдите пространство имен в Викисловаре, бесплатном словаре. |
- 11-значный почтовый индекс пункта доставки
- Биномиальная номенклатура (род-вид в биологии )
- Химическая номенклатура
- Десятичная классификация Дьюи
- Идентификатор цифрового объекта
- система доменных имен
- Идентичность (объектно-ориентированное программирование)
- Классификация Библиотеки Конгресса
- Звездные каталоги и астрономические соглашения об именах
- Пространство имен XML
- Поиск имени, зависящего от аргумента
Ссылки [ править ]
- ^ Адья, Атул; Болоски, Уильям; Кастро, Мигель; Чермак, Джеральд; Чайкен, Ронни; Дусер, Джон; Хауэлл, Джон; Лорч, Джейкоб; Таймер, Марвин; Ваттенхофер, Роджер (2002). FARSITE: объединенное, доступное и надежное хранилище для не полностью доверенной среды (PDF) . Proc. USENIX Symp. по проектированию и внедрению операционных систем. Архивировано из оригинального (PDF) 28 июля 2010 года.
Первичная конструкция, устанавливаемая файловой системой, - это иерархическое пространство имен каталогов, которое является логическим хранилищем файлов.
- ^ «C # FAQ: Что такое пространство имен» . http://en.csharp-online.net/ : C # Online Net. Архивировано из оригинала на 2013-10-20 . Проверено 23 февраля 2010 .
Пространство имен - это не что иное, как группа сборок, классов или типов. Пространство имен действует как контейнер - как папка на диске - для классов, организованных в группы, обычно на основе функциональности. Синтаксис пространства имен C # допускает вложение пространств имен.
- ^ «Обзор пространств имен в PHP» . Руководство по PHP .
Что такое пространства имен? В самом широком определении пространства имен - это способ инкапсуляции элементов. Во многих местах это можно рассматривать как абстрактное понятие. Например, в любой операционной системе каталоги служат для группировки связанных файлов и действуют как пространство имен для файлов внутри них.
- ^ «Создание и использование пакетов» . Документация по Java . Oracle.
Пакет - это группа связанных типов, обеспечивающая защиту доступа и управление пространством имен.
Обратите внимание, что типы относятся к классам, интерфейсам, перечислениям и типам аннотаций.
Типы перечислений и аннотаций - это особые виды классов и интерфейсов соответственно, поэтому в этом уроке типы часто упоминаются просто как классы и интерфейсы.
[ нужен лучший источник ] - ^ Ядро XML Рабочая группа (8 декабря 2009). «Пространства имен в XML 1.0 (третье издание)» . W3C . Проверено 30 марта 2012 .
- ^ Moats, Райан (май 1997). «Синтаксис» . Синтаксис URN . IETF . п. 1 сек. 2. дои : 10,17487 / запрос RFC2141 . RFC 2141 . Проверено 30 марта 2012 .
- ^ Стивен Дж. Гауди. «Список USB-идентификаторов» . 2013.
- ^ Sollins & Masinter (декабрь 1994). «Требования к функциональным возможностям» . Функциональные требования к унифицированным именам ресурсов . IETF . п. 3. сек. 2. дои : 10,17487 / RFC1731 . RFC 1731 . Проверено 30 марта 2012 .
- ^ «C # FAQ: Что такое пространство имен» . http://en.csharp-online.net/ : C # Online Net. Архивировано из оригинального 20 октября 2013 года . Проверено 23 февраля 2010 .
Например, [в
Windows
] для доступа к классам и членам встроенного ввода-вывода (I / O) используйте пространство имен System.IO.
Или, чтобы получить доступ к классам и членам, связанным с Интернетом, используйте пространство имен System.Web.
- ^ «Пространство имен» - это логическая группа имен, используемых в программе. " " . Webopedia.com . Проверено 26 июля 2011 .
- ^ «Пространства имен позволяют группировать сущности, такие как классы, объекты и функции, под именем» . Cplusplus.com . Проверено 26 июля 2011 .
- ^ «6. Модули» . Учебник по Python . Фонд программного обеспечения Python . Проверено 25 октября 2010 года .
- ^ «Области действия и пространства имен Python» . Docs.python.org . Проверено 26 июля 2011 .
- ^ https://docs.python.org/3/tutorial/modules.html "в целом практика импорта * из модуля или пакета не одобряется"
- ^ Дэнни Калев. «Почему я ненавижу пространства имен» . Архивировано 9 июля 2016 года.CS1 maint: bot: исходный статус URL неизвестен ( ссылка )