Что такое пространства имен Python - PullRequest
40 голосов
/ 12 октября 2010

Я только начал изучать Python и натолкнулся на концепцию "пространства имен" в Python. Пока я понял, что это такое, но не смог оценить серьезность этой концепции.

Некоторые просмотры в сети показали, что одной из причин, по которым PHP не работает, является отсутствие встроенной поддержки пространств имен.

Может ли кто-нибудь объяснить, как использовать пространства имен и как эта функция делает программирование лучше (не только в Python, поскольку я предполагаю, что пространства имен не являются концепцией, ограниченной конкретным языком).

В основном я работаю на Java и C.

Ответы [ 5 ]

45 голосов
/ 12 октября 2010

Пространство имен - это способ реализации области действия.

В Java (или C) компилятор определяет, где переменная видима, посредством статического анализа области.

  • В C область действия - это либо тело функции, либо глобальное, либо внешнее. Компилятор обдумывает это и разрешает каждое имя переменной на основе правил области видимости. Внешние имена разрешаются компоновщиком после компиляции всех модулей.

  • В Java область действия - это тело функции метода или всех методов класса. Некоторые имена классов также имеют область действия уровня модуля. Опять же, компилятор выясняет это во время компиляции и разрешает каждое имя на основе правил области действия.

В Python каждому пакету, модулю, классу, функции и методу-функции принадлежит «пространство имен», в котором разрешаются имена переменных. Кроме того, есть глобальное пространство имен, которое используется, если имя отсутствует в локальном пространстве имен.

Каждое имя переменной проверяется в локальном пространстве имен (тело функции, модуль и т. Д.), А затем проверяется в глобальном пространстве имен.

Переменные обычно создаются только в локальном пространстве имен. Операторы global и nonlocal могут создавать переменные не в локальном пространстве имен.

Когда функция, метод, модуль или пакет оцениваются (то есть начинает выполнение), создается пространство имен. Думайте об этом как "контекст оценки". Когда функция или метод, и т. Д. Заканчивают выполнение, пространство имен сбрасывается. Переменные отброшены. Объекты также могут быть сброшены.

5 голосов
/ 12 октября 2010

Пространства имен предотвращают конфликты между классами, методами и объектами с одинаковыми именами, которые могли быть написаны разными людьми.

Исходя из фона Java, вы, вероятно, знакомы с тем, как это достигается с помощью пакетов, например. Вы можете создать класс movieyoda.DateUtils, а я могу создать класс mikej.DateUtils, и пакет позволяет коду с помощью классов различать их. (Python имеет что-то очень похожее .)

Пространства имен были добавлены в PHP в 5.3.0, но в более ранних версиях (и в других языках, которые не предоставляют пространства имен), вам пришлось бы добавлять префиксы к именам классов и методов, чтобы уменьшить риск конфликта имен. например movieyoda_parse_file функция.

3 голосов
/ 12 октября 2010

Чтобы понять пространства имен, вы также должны иметь некоторое представление о модулях в Python. Модуль - это просто файл, содержащий код Python. Этот код может быть в форме классов, функций Python или просто списка имен. Каждый модуль получает свои собственные глобальные пространства имен. Таким образом, вы не можете иметь два класса или две функции в одном модуле с одним и тем же именем, поскольку они совместно используют пространство имен модуля.

ссылка: http://bytebaker.com/2008/07/30/python-namespaces/

0 голосов
/ 10 октября 2016

Я заканчиваю ответ С. Лотта.

Я бы сказал, что пространство имен - это способ реализации управления именами внутри области, поскольку область делает больше, чем просто управление именами.

В языке C области имеют 4 типа: глобальные, функциональные, блочные и функциональные параметры (прототип). Каждый из этих видов может создавать одно или несколько пространств имен, в зависимости от потребностей. Есть 4 нс в C - теги для з / у / э - идентификаторы для typenames, имен функций и имен var - параметры внутри прототипа функции - члены и битовые поля внутри s / u.

Таким образом, идентификаторы тегов и имена функций не конфликтуют, но имена типов, определенные с помощью typedef, могут конфликтовать с именами переменных.

В python есть встроенное пространство имен, которое содержит глобальные ns, а глобальные ns предоставляются загруженным модулем. Встроенные переменные содержат переменные. Символ для переменной может определять объект или функцию - например, там определяется +. Глобальный ns модуля длится до завершения.

См. Также , что и, конечно, , что .

0 голосов
/ 12 октября 2010

Если вы создаете большую программу с кем-то еще, вы можете написать свою часть программы так, как вам хочется.Все переменные в файле будут приватными, коллизий не будет.Когда вы пишете программы на PHP, глобальные переменные легко переписать по ошибке.В python вы можете импортировать переменные других модулей, если хотите, и они будут «глобальными» для вашего модуля.

Вы можете думать, что один файл - один объект в Python.Когда вы пишете программы PHP, вы можете достичь того же, написав классы с переменными экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...