Я думаю, что это связано с хорошим дизайном ООП. Если Вы - разработчик библиотеки, Вы хотите скрыть внутренние работы своей библиотеки. Тем путем можно изменить библиотеку внутренние работы позже. Таким образом, Вы помещаете своих участников и вспомогательные методы, поскольку частные, и только методы интерфейса общедоступны. Должны быть защищены методы, которые должны быть перезаписаны.
По умолчанию Visual Studio помещает слово "использование" в верхней части файлов. Однако рекомендуемый подход заключается в помещении операторов using внутри пространства имен. Даже stylecop от MS улавливает это и говорит, что использование VS по умолчанию неверно.
Оба метода работают нормально.
Правило StyleCop гласит: Размещение нескольких элементов пространства имен в одном файле обычно плохая идея, но если и когда это готово, рекомендуется разместить все директивы using внутри каждого из элементы пространства имен, а не глобально вверху файла. Эта будет ограничивать пространства имен плотно, и также поможет избежать поведение, описанное выше.
Важно отметить, что когда код был написан с использованием директив размещен вне пространства имен, забота следует принимать во внимание при перемещении этих директивы в пространстве имен, чтобы убедитесь, что это не меняет семантика кода. Как объяснено выше, разместив директивы using-alias внутри элемента пространства имен позволяет компилятор на выбор конфликтующие типы, которые будут не происходит, когда директивы размещены вне пространства имен.
Вот несколько ссылок для дальнейшего изучения:
vector v = point2 - point1;
normalize(v);
v *= D;
finalPoint = point1 + v;
- Обычно у вас будет каталог, имя которого является именем вашего пакета, где-то на вашем PYTHONPATH. Например:
eulerproject/
euler/
__init__.py
euler1.py
...
tests/
...
setup.py
Затем вы можете либо установить его в масштабе всей системы, либо не забудьте указать PYTHONPATH = / path / to / eulerproject /: $ PYTHONPATH
при вызове вашего скрипта.
Абсолютный импорт, например тогда это будет работать:
from euler import euler1
Изменить :
Согласно документации Python, «модули, предназначенные для использования в качестве основного модуля приложения Python, всегда должны использовать абсолютный импорт». ( Цитируйте )
Таким образом, тестовая программа, такая как нос
, упомянутая в другом ответе, работает, потому что она импортирует пакеты, а не запускает их из командной строки.
Если вы Если вы хотите что-то делать вручную, ваш исполняемый скрипт должен находиться вне иерархии пакетов, например:
eulerproject/
runtests.py
euler/
__init__.py
euler1.py
...
tests/
__init__.py
testeulern.py
Теперь runtests.py
может выполнять из euler.tests.testeulern import TestCase
и testeulern.py
могут делать из .. import euler1
У меня была такая же проблема. Теперь я использую нос для запуска моих тестов, и относительный импорт обрабатывается правильно.
Да, вся эта штука с относительным импортом сбивает с толку.