2016-06-08 4 views
1

Я хочу вызвать функцию внутри модуля, когда импортируется сам модуль ;Проверьте, был ли мой модуль импортирован

Из того, что я тестировал, кажется, что я могу просто проверить, не __name__ не __main__ и использовать его в качестве решения; но мне было интересно, есть ли лучший способ с каким-то импортным крюком?

if __name__ != '__main__': 
    # I was imported 
    ... 

Я хочу изменить объект, который существует в модуле для данного конкретного случая, и изменить его только один раз.

У меня был успех в этом; но мне интересно, есть ли другой способ приблизиться к этому.

if __name__ == '__main__': 
    example = 0 
else: 
    example = 1 
+1

Вы хотите, чтобы это произошло каждый раз, когда оно было импортировано, или только в первый раз на каждого переводчика? – user2357112

+0

Возможный дубликат [this] (http://stackoverflow.com/questions/5027352/how-to-test-if-one-python-module-has-been-imported) – limbo

+1

@limbo Этот вопрос не из правильная перспектива; Я хочу это с точки зрения модуля. – jacob

ответ

1

Логический уровень верхнего уровня Python один раз при импорте. Примеры можно найти в реализации stdlib hashlib здесь (github в данный момент отсутствует). https://fossies.org/dox/Python-3.5.1/hashlib_8py_source.html#name=l00131

Обратите внимание на использование try...except условных импорта и линии верхнего уровня, начиная с линии № 57

57 __always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512') 
58 
59 algorithms_guaranteed = set(__always_supported) 
60 algorithms_available = set(__always_supported) 

Те создаются один раз на импорт, а не последующие вызовы. Одной из причин, почему он работает таким образом, является то, что модуль является объектом и хранится в sys.modules - Py2 but same for Py3.

Редактировать: Чтобы уточнить, вы можете использовать модули, такие как singletons, но это путь к безумию, поскольку он может сделать модульное тестирование и отладку болезненным, если не невозможным.

+0

Спасибо за ваш ответ; Не думаю, что я был достаточно конкретным в своем вопросе. Я с тех пор внес поправки и надеюсь, что я более подробно разбираюсь в том, что я ищу. – jacob

+0

@jacob Это как раз то, как это делает Python, особенно для тестирования и в ситуациях, подобных модульным тестам или приложениям, которые реализуют \ _ \ _ main \ _ \ _, или я пропустил что-то еще в вашем вопросе? – David

+0

@jacob, если он кажется глупым, но он работает, и кто-то может понять, что он делает, он все равно может быть глупым, но он работает. – David

Смежные вопросы