Подтвердить что ты не робот

Что такое пространства имен Python?

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

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

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

В основном я получаю из фонов программирования Java и C.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Я завершу ответ S.Lott.

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

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

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

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

См. также который и, конечно, который.