Подтвердить что ты не робот

Как python имеет дело с модулем и пакетом с тем же именем?

Предположим, что у меня есть модуль foo.py и пакет foo/. Если я позвоню

import foo

который будет загружен? Как я могу указать я wand для загрузки модуля или пакета?

4b9b3361

Ответ 1

Я считаю, что пакет всегда будет загружен. Насколько я знаю, вы не можете обойти это. Поэтому измените либо пакет, либо имя модуля. Документы: http://docs.python.org/tutorial/modules.html#the-module-search-path

Ответ 2

Собственно, это возможно (этот код не очень хорошо протестирован, но, похоже, работает).

Файл foo.py

print "foo module loaded"

Файл foo/__init__.py

print "foo package loaded"

Файл test1.py

import foo

Файл test2.py

import os, imp

def import_module(dir, name):
    """ load a module (not a package) with a given name 
        from the specified directory 
    """
    for description in imp.get_suffixes():
        (suffix, mode, type) = description
        if not suffix.startswith('.py'): continue
        abs_path = os.path.join(dir, name + suffix)
        if not os.path.exists(abs_path): continue
        fh = open(abs_path)
        return imp.load_module(name, fh, abs_path, (description))

import_module('.', 'foo')

Запуск

$ python test1.py 
foo package loaded

$ python test2.py 
foo module loaded

Ответ 3

Возможно, вы хотите переместить свои классы из модуля foo.py в __init__.py.

Таким образом вы сможете импортировать их из пакета, а также импортировать дополнительные подпакеты:

Файл foo/__init__.py:

class Bar(object):
...

Файл mymodule.py:

from foo import Bar
from foo.subfoo import ...

Тем не менее, я хотел бы, чтобы кто-то дважды проверял этот подход и сообщал мне, исправляется ли он, или модуль __init__ не должен использоваться таким образом.