При попытке сделать что-то похожее на то, что в рецепте ActiveState под названием Constants in Python от Alex Martelli, я столкнулся с неожиданным побочным эффектом (в Python 2.7), который присваивает экземпляр класса записи в sys.modules
, а именно: это делает, по-видимому, изменяет значение __name__
на None
, как показано в следующем фрагменте кода (что нарушает часть кода в рецепте):
class _test(object): pass
import sys
print '# __name__: %r' % __name__
# __name__: '__main__'
sys.modules[__name__] = _test()
print '# __name__: %r' % __name__
# __name__: None
if __name__ == '__main__': # never executes...
import test
print "done"
Я хотел бы понять, почему это происходит. Я не думаю, что это было так в Python 2.6 и более ранних версиях, так как у меня есть более старый код, где, по-видимому, условное условие if __name__ == '__main__':
работало так, как ожидалось после назначения (но больше не работает).
FWIW, я также заметил, что после None
имя _test
получает от объекта класса до None
. Мне кажется странным, что они отскакивают до None
, а не исчезают вообще...
Update:
Я хотел бы добавить, что любые обходные пути для достижения эффекта if __name__ == '__main__':
, учитывая то, что происходит, будут с большой благодарностью. ТИА!