Безопасно ли изменять вывод globals ()? - PullRequest
21 голосов
/ 11 мая 2011

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

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

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

1 Ответ

23 голосов
/ 11 мая 2011

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

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

...