В Python определение пакета очень просто. Подобно Java, иерархическая структура и структура каталогов одинаковы. Но вы должны иметь __init__.py
в пакете. Я объясню файл __init__.py
следующим примером:
package_x/
|-- __init__.py
|-- subPackage_a/
|------ __init__.py
|------ module_m1.py
|-- subPackage_b/
|------ __init__.py
|------ module_n1.py
|------ module_n2.py
|------ module_n3.py
__init__.py
может быть пустым, если он существует. Он указывает, что каталог следует рассматривать как пакет. Конечно, __init__.py
также может установить соответствующий контент.
Если мы добавим функцию в module_n1:
def function_X():
print "function_X in module_n1"
return
После запуска:
>>>from package_x.subPackage_b.module_n1 import function_X
>>>function_X()
function_X in module_n1
Затем мы выполнили пакет иерархии и вызвали функцию module_n1. Мы можем использовать __init__.py
в subPackage_b следующим образом:
__all__ = ['module_n2', 'module_n3']
После запуска:
>>>from package_x.subPackage_b import *
>>>module_n1.function_X()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named module_n1
Следовательно, используя * import, пакет модулей подчиняется __init__.py
контенту.
Объяснение - то, что Вы хотите отличить набор всех возможных (отрицательных) возвращаемых значений, соответствующих различным ошибкам от единственная ситуация, в которой все пошли хорошо. Самое простое, самое краткое и большая часть C-выхода, способом преследовать такое различие является логический тест, и с тех пор в C все целые числа, "верны" за исключением нуля, Вы хотите возвратить нуль для значения "единственной ситуации", т.е. Вы хотите нуль как "хорошее" значение.
та же цепь рассуждений относится к возвращаемым значениям программ Unix, но действительно в тестах в рамках сценариев оболочки Unix логика инвертируется: возвращаемое значение 0 означает "верный" (например, посмотрите на возвращаемое значение/bin/true).
Первоначально, C не имел "пусто". Если функция ничего не возвратила, Вы просто оставили тип возврата в пробеле объявления. Но это означало, что это возвратило интервал
Так, все возвратило что-то, даже если это ничего не означало. И, если Вы конкретно не обеспечили возвращаемое значение, независимо от того, что значение, оказалось, было в регистре, который раньше возвращал значения компилятор, стал возвращаемым значением функции.
// Perfectly good K&R C code.
NoReturn()
{
// do stuff;
return;
}
int unknownValue = NoReturn();
Люди взяли к очистке этого для обнуления для предотвращения проблем.
В сценариях оболочки, 0 представляет верный, где другое число обычно представляет код ошибки. Возврат 0 из главного приложения означает, что все пошло успешно. Та же логика может применяться к коду библиотеки.
могло также просто случиться так, что они не возвращают ничего, которое интерпретируется как 0. (По существу то же понятие.)
Другая (незначительная) причина имеет отношение к скорости машины уровня и размеру кода.
В большинстве процессоров, любая операция, которая приводит к нулю автоматически, устанавливает нулевой флаг, и существует очень дешевая операция для перехода против нулевого флага.
, Другими словами, если последняя эксплуатация машины (например, НАЖАТИЕ) заставила нас обнулять, все, которое нам нужно, вскакивать-нуль или jump-not-zero.
, С другой стороны, если мы тестируем вещи против некоторого другого значения, затем мы должны переместить то значение в регистр, выполнить сравнить операцию, которая по существу вычитает эти два числа и результаты равенства в нашем нуле.
Поскольку Bash и большинство других сред оболочки UNIX рассматривают 0 как успех и-x как системная ошибка и x как пользовательская ошибка.
Существует, вероятно, набор истории, о которой забывают, относящейся ко времени дней, когда все было записано в asm. В целом намного легче протестировать на нуль, чем для других определенных значений.
Я могу быть неправ относительно этого, но я думаю, что это главным образом по историческим причинам (истеричный изюм?). Я верю этому K& R C (предварительный ANSI) не имел пустого типа, таким образом, логический способ записать функцию, которая не возвратила ничего интересного, состоял в том, чтобы иметь его, возвращаются 0.
, Конечно, кто-то здесь исправит меня, если я буду неправ... :)
Мое понимание - то, что это было связано с поведением системных вызовов.
Рассматривают open()
системный вызов; если это успешно, это возвращает неотрицательное целое число, которое является дескриптором файла, который был создан. Однако вниз на ассемблерном уровне (где существует специальное предложение, non-C инструкция, что прерывания в ядро), когда ошибка возвращается, она возвращается как отрицательная величина. Когда это обнаруживает ошибочный возврат, обертка кода C вокруг системного вызова хранит отрицаемое значение в errno
(таким образом errno
имеет положительное значение), и функция возвращается-1.
Для некоторых других системных вызовов, отрицательный код возврата на ассемблерном уровне все еще отрицается и помещается в errno
, и-1 возвращается. Однако эти системные вызовы не имеют никакого специального значения для возврата, таким образом, нуль был выбран для указания на успех. Очевидно, существует большое множество системных вызовов, но большинству удается соответствовать этим конвенциям. Например, stat()
и его родственники возвращают структуру, но указатель на ту структуру передается как входной параметр, и возвращаемое значение является 0 или-1 состоянием. Даже signal()
управляет им;-1 был SIG_DFL, и 0 был SIG_IGN, и другие значения были указателями функции. Существует несколько системных вызовов без ошибочного возврата - getpid()
, getuid()
и так далее.
Этот zero-indicates-success механизм был затем эмулирован другими функциями, которые не были на самом деле системными вызовами.
Традиционно, код возврата 0 указывает, что Ваша программа обычно заканчивалась, и все хорошо. (Можно помнить это как "нулевые ошибки", хотя для технических причин, Вы не можете использовать количество ошибок Ваша программа, найденная как код возврата. Посмотрите Стиль.) Код возврата кроме 0 указывает, что своего рода ошибка произошла. Если Ваш код завершается, когда он встречается с ошибкой, используйте выход и укажите ненулевой код возврата. Источник
Поскольку 0 ложь и пустой указатель в C/C++, и можно сделать удобные короткие пути, когда это происходит.
Это - потому что при использовании от UNIX окружают команду, которая возвращается 0, указывает на успех.
Любое другое значение указывает на отказ. Поскольку Paul Betts указывает на положительные и отрицательные величины delimitate, где ошибка, вероятно, произошла, но это - только конвенция и не абсолют. Пользовательское приложение может возвратить отрицательное значение без любого плохого последствия (кроме него, указывает к оболочке, что приложение перестало работать).
Помимо всех тонкостей, сделанных предыдущими плакатами, это также очищает код значительно, когда функция возвращается 0 на успехе.
Рассмотрите:
if ( somefunc() ) {
// handle error
}
является намного более чистым, чем:
if ( !somefunc() ) {
// handle error
}
или:
if ( somefunc() == somevalue ) {
// handle error
}