2013-12-12 2 views
2

Если бы я хотел получить текущий модуль, например. перезагрузить его, я хотел бы сделать:Получить текущий объект модуля python (по имени или по-другому)

import sys 
sys.modules[__name__] 

Есть ли лучший способ сделать это (например, не связанный с __name__)? Лучше в этом контексте означает больше идиоматических, более портативных, более надежных или более ... любых других вещей, которые мы обычно желаем в нашем программном обеспечении.

Я использую python 2, но ответы для python 3, без сомнения, будут полезны другим.

+4

Нет, 'sys.modules [__ name __]' is * точно * right. –

+1

Возможно, вы захотите прочитать [PEP 395] (http://www.python.org/dev/peps/pep-0395/), в котором описаны все известные ловушки/проблемы с '__name__', и объясняется, почему нет лучших альтернатив, которые могут избежать любого из них на Python, как сегодня (3.4 - и, конечно же, это даже больше) для 2.7). (Несмотря на название, он предложил несколько связанных изменений, а не просто добавление '__qualname__', как специальный метапат, чтобы сделать' __main__', а действительное имя модуля эквивалентно.) – abarnert

+0

@abarnert Удивительный, очень информативный. – Marcin

ответ

3

Нет более идиоматического метода для получения текущего объекта модуля от sys.modules, чем вы использовали.

__name__ устанавливается Python на импорт, по существу дела:

module_object = import_py_file(import_name) 
module_object.__name__ = import_name 
sys.modules[import_name] = module_object 

так __name__ ссылка точно то, что вы хотите использовать здесь.

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