Что такое пространства имен Python?
Я только начал изучать Python и столкнулся с "пространствами имен в Python. В то время как я понял, что это такое, но я не могу оценить серьезность этой концепции.
Некоторые просмотры в сети показали, что одна из причин, идущих против PHP, заключается в том, что у нее нет встроенной поддержки пространств имен.
Может кто-нибудь объяснить, как использовать пространства имен и как эта функция улучшает программирование (не только в Python, так как я предполагаю, что пространства имен не являются понятием, ограниченным определенным языком).
В основном я получаю из фонов программирования Java и C.
Ответы
Ответ 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 длится до завершения.
См. также который и, конечно, который.