Правила стиля не являются языковыми правилами. Т.е. вы не должны использовать eval()
, но он есть в языке.
скажите мне эмпирическое правило относительно того, когда мы должны глобализировать переменную в функции, а когда это не обязательно?
Правила, когда, а когда нет, использовать global
просты, но даже обучающие материалы в Интернете ошибаются.
-
global
ключевое слово не должно использоваться для создания глобальной переменной.
(Да, это частично правило стиля .) Когда вы определяете верхний уровень переменная вне функции, Python делает ее глобальной. (Вы не используете для этого ключевое слово global
.) Когда вы назначаете переменной внутри функции, Python предполагает, что он является локальным по отношению к функции. Вам нужно только ключевое слово global
, если вы хотите изменить это более позднее предположение, чтобы можно было переназначить (=) глобальную переменную из функции. Объявление global
не требуется для проверки глобальной переменной. Он не требуется для вызова метода глобальной переменной, который может изменить ее внутреннее состояние или содержимое:
Вам нужно только ключевое слово
global
, если вы хотите переназначить (=) глобальную переменную внутри функции.
Объявление global
используется в любой функции, где глобальная переменная переназначен. Он помещается перед первой ссылкой на переменную, доступ или присвоение. Для простоты и стиля глобальные операторы помещаются в начало функции.
Такие утверждения, как «Вы никогда не должны использовать глобальные переменные», является правилом стиля и справедливо для большинства языков программирования - применяйте его. если / когда сможешь. А если вы совершенно не можете этого сделать, не расстраивайтесь, просто:
Прокомментируйте все глобальные переменные, которые вы правильно используете.
Глобальные константы не являются проблемой:
Если глобальные константы действительно постоянны, им никогда не понадобится ключевое слово
global
.
@juanpa.arrivillaga Пример go_left()
использования дополнительных значений в качестве параметров вместо глобальных переменных не позволяет примите во внимание, что go_left()
- это обратный вызов и что функции назначения событий черепахи не предоставляют дополнительных параметров. (Они должны, но они этого не делают.) Мы можем обойти это, используя выражение lambda
(или функцию partial
из functools ), но при таком использовании lambda
не особенно отличный стиль, ИМХО. не сказано, что это означает создание подкласса Turtle или обертывание экземпляра черепахи другим классом.
Моя личная проблема с изменяемыми глобальными c глобальными переменными в том, что они проблематичны в многопоточном мире.