Python использует глобальный vs спецификацию модуля - PullRequest
5 голосов
/ 30 декабря 2011

Хотелось бы знать, есть ли у кого-нибудь мысли по поводу использования глобального Python вместо ссылки на сам модуль. Хотя в прошлом я использовал global когда это было необходимо, я обнаружил, что делать второй метод несколько яснее (и в последнее время склонялся к этому синтаксису):

import sys
mod = sys.modules[__name__]

counter = 0

def incrementGlobal():
    global counter
    counter += 1

def incrementMod():
    mod.counter += 1

Очевидно, что оба они работают нормально, но если у кого-то есть какие-либо сильные мнения (что более питонично, в исполнении и т. Д.), Я бы хотел их услышать.

Между прочим, я использую любой из них в ситуациях, когда модуль естественным образом инкапсулирует все методы и атрибуты того, что было бы одним классом, и вместо ссылки на incrementmodule.IncrementClass.counter я могу просто использовать incrementmodule.counter.

Ответы [ 2 ]

5 голосов
/ 30 декабря 2011

Идти с global каждый раз.Ключевое слово global - это очевидный и легко узнаваемый шаблон для изменения чего-либо на уровне модуля.Предоставление модулю ссылки на самого себя из sys.modules кажется излишне запутанным способом обхода его и может запутать следующего программиста, который на него смотрит.

3 голосов
/ 30 декабря 2011
  • Производительность: использование стиля global будет чуть-чуть быстрее, так как для него требуется только один поиск имени вместо двух (это будет иметь значение только в тесном цикле из многих тысяч) .

  • Стиль: стиль mod.xxx отражает способ доступа к глобальным переменным из другого импортированного вами модуля:

`

import foo
foo.eggs = 'scrambled'

Метод global более распространен, но ваш метод mod.xxx также прост для понимания и очень удобочитаем.

...