Условный Относительный Импорт в Python ... делать или не делать? - PullRequest
2 голосов
/ 25 августа 2011

Имеется следующий пакет:

testpackage
    __init__.py
    testmod.py
    testmod2.py

Содержимое __init__.py

from . import testmod
from . import testmod2

Содержимое testmod.py

# relative import without conditional logic, breaks when run directly
from . import testmod2
...
if __name__ == '__main__':
    # do my module testing here
    # this code will never execute since the relative import 
    # always throws an error when run directly

Содержимое testmod2.py

if __name__ == 'testpackage.testmod2':
    from . import testmod
else:
    import testmod
...
if __name__ == '__main__':
    # test code here, will execute when the file is run directly
    # due to conditional imports

Это плохо?Есть ли лучший способ?

1 Ответ

1 голос
/ 25 августа 2011

Это определенно станет головной болью в будущем.Не только условный импорт ... больше причина , почему вам приходится выполнять условный импорт, а именно то, что при запуске testpackage/testmod2.py в качестве основного сценария первая запись sys.path становится ./testpackage вместо ., что само существование пакета testpage как пакета исчезает.

Вместо этого я бы порекомендовал запустить testmod2 через python -m testpackage.testmod2 и сделать это снаружи testpackage.testpackage.testmod2 по-прежнему будет отображаться как __main__, но условный импорт всегда будет работать, поскольку testpackage всегда будет пакетом.

Подвох с -m в том, что для него требуется Python 2.5 или новее .

...