Пытаясь сделать что-то похожее на то, что в рецепте ActiveState Алекса Мартелли под названием Константы в Python , я столкнулся с неожиданным побочным эффектом (в 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, я также заметил, что имя _test
получает отскок от объекта класса к None
также после назначения. Мне кажется странным, что они возвращаются к None
, а не исчезают совсем ...
Обновление:
Я хотел бы добавить, что любые обходные пути для достижения эффекта if __name__ == '__main__':
, учитывая то, что происходит, будут с благодарностью. ТИА!