Безопасно ли изменять выходные данные globals ()?

#python #globals

#python #глобальный

Вопрос:

Документация для функции locals() специально предупреждает не изменять ее выходные данные, поскольку интерпретаторы могут не отражать изменения в локальной области видимости. Я предполагаю, что это означает, что спецификация Python этого не требует, даже если она работает в CPython.

Я хотел бы знать, то же ли это для globals (). В документации нет предупреждения, но мне кажется странным, что это будет отличаться, поскольку каждая функция, по-видимому, выполняет одно и то же действие в другой области.

Если это безопасно, изменение выходных данных globals () улучшило бы простоту и совместимость проекта, над которым я работаю.

Комментарии:

1. «изменение выходных данных globals () улучшило бы простоту и совместимость». Это очень трудно понять. Вероятно, вам следует задать реальный вопрос по этой теме «простота и совместимость» и забыть о том, чтобы играть в странные игры с globals() .

2. @rspeed: Я спрашиваю, потому что такого рода вещи раскрывают «крысиную нору потерянного времени». Поиск далеко не идеального решения ведет в тупик, который на самом деле плохо работает. В некоторых случаях лучше прекратить попытки и сделать что-нибудь попроще. (1) «Это был бы невероятно сложный вопрос» указывает на то, что что-то может быть не так со всем подходом и (2) «исправление этих проблем невозможно» также указывает на то, что что-то может быть не так со всем подходом.

3. Что ж, если вы так склонны, не стесняйтесь взглянуть на проект: github.com/rspeed/Django-MetaSettings Рассматриваемый код — это метод, используемый для поддержания области видимости при (по существу) объединении нескольких файлов настроек Django. Эта область — это именно то, что возвращает globals () при запуске внутри settings.py .

4. import не позволяет поддерживать область видимости без того, чтобы файлы с более конкретными настройками импортировали менее конкретные файлы. Это решение слишком негибкое для некоторых проектов, над которыми я работал.

5. Это негибко, потому что нет способа создать правила, которые указывают, какие настройки загружать в каких средах. Кроме того, стек настроек должен быть одинаковым на каждой машине. Бывают ситуации, когда не следует загружать некоторые промежуточные файлы настроек.

Ответ №1:

Изменение locals() не работает надежно, даже в CPython. Случается, что это работает в областях модулей и классов, но внутри функции происходит сбой (любые изменения «не будут приняты», поскольку locals() в этом случае предоставляется копия локального пространства имен, а не ссылка на реальную вещь)

Однако globals() это другое, поскольку это всегда ссылается на пространство имен модуля, а пространства имен модулей должны вести себя как обычные словари. Так что да, отсутствие предупреждения на globals() не является упущением, это действительно разрешено.