Должен ли быть .py-файл для каждого импорта или из инструкции импорта x? [Дубликат]

Каждый раз, когда вы получаете ...

"Warning: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, boolean задан«

... это, вероятно, из-за проблемы с вашим запросом. prepare() или query() могут возвращать FALSE (логическое), но это общее сообщение об отказе не оставляет вас в стороне от подсказок. Как вы узнаете, что не так с вашим запросом? Вы задаете !

Прежде всего убедитесь, что сообщения об ошибках включены и видны: добавьте эти две строки в начало файла (ов) сразу после открытия <?php:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Если ваше сообщение об ошибках установлено в php.ini, вам не придется беспокоиться об этом. Просто убедитесь, что вы обрабатываете ошибки изящно и никогда не раскрываете истинные причины каких-либо проблем для ваших пользователей. Выявление истинной причины для общественности может быть приглашением на золото с гравировкой для тех, кто хочет нанести вред вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете следить за журналами ошибок веб-сервера. Расположение журналов будет варьироваться от сервера к серверу, например, на Ubuntu журнал ошибок обычно находится в /var/log/apache2/error.log. Если вы изучаете журналы ошибок в среде Linux, вы можете использовать tail -f /path/to/log в окне консоли, чтобы видеть ошибки, когда они происходят в режиме реального времени .... или как вы их делаете.

Как только вы 'squared away на стандартном сообщении об ошибках, добавляющем проверку ошибок в вашем соединении с базой данных, и запросы дадут вам гораздо более подробную информацию о проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, возвращающий роковое сообщение об ошибке:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

Ошибка является общей и не очень помогает вам в решении того, что происходит.

С помощью пары больше строк кода вы можете получить очень подробную информацию, которую вы можете использовать для решения проблемы сразу . Проверьте утверждение prepare() для правдивости, и если это хорошо, вы можете перейти к привязке и исполнению.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

Если что-то не так, вы можете выплюнуть сообщение об ошибке, которое приведет вас к проблеме , В этом случае в таблице нет столбца foo, решение проблемы тривиально.

Если вы выберете, вы можете включить эту проверку в функцию или класс и расширить ее, обработав ошибки изящно, как упомянутых ранее.

1449
задан guaka 1 November 2015 в 23:37
поделиться

11 ответов

Это часть пакета. Вот документация.

Файлы __init__.py необходимы, чтобы Python рассматривал каталоги как содержащие пакеты; это делается для того, чтобы предотвратить каталоги с общим именем, например string, от непреднамеренного скрытия допустимых модулей, которые происходят позже (глубже) на пути поиска модуля. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять код инициализации для пакета или устанавливать переменную __all__, описанную ниже.

1002
ответ дан daneel 1 September 2018 в 10:39
поделиться

Файл __init__.py делает Python лечением каталогов, содержащих его как модули.

Кроме того, это первый файл, который должен быть загружен в модуль, поэтому вы можете использовать его для выполнения кода, который вы хотите запускать каждый раз при загрузке модуля, или указать подмодули, которые будут экспортированы.

87
ответ дан Can Berk Güder 1 September 2018 в 10:39
поделиться

Что такое __init__.py, используемый для?

Основное использование __init__.py - инициализация пакетов Python. Самый простой способ продемонстрировать это - взглянуть на структуру стандартного модуля Python.

package/
    __init__.py
    file.py
    file2.py
    file3.py
    subpackage/
        __init__.py
        submodule1.py
        submodule2.py

Как вы можете видеть в структуре выше, включение файла __init__.py в каталог указывает интерпретатору Python, что каталог должен рассматриваться как пакет Python

Что входит в __init__.py?

__init__.py может быть пустым файлом, но часто используется для выполнения (импортировать вещи, загружать вещи в путь и т. д.).

. Одна общая вещь, которую вы делаете в своем __init__.py, - импортировать выбранные классы, функции и т. д. в уровень пакета, чтобы они могли быть уверенно импортированным из пакета.

В приведенном выше примере мы можем сказать, что файл.py имеет файл класса. Таким образом, без чего-либо в нашем __init__.py вы импортируете этот синтаксис:

from package.file import File

Однако вы можете импортировать файл в свой __init__.py, чтобы сделать его доступным на уровне пакета:

# in your __init__.py
from file import File

# now import File from package
from package import File

Еще одна вещь, которую нужно сделать, это на уровне пакета сделать подпакеты / модули доступными с переменной __all__. Когда интерпретатор видит переменную __all__, определенную в __init__.py, он импортирует модули, перечисленные в переменной __all__, когда вы это делаете:

from package import *

__all__ - это список, содержащий имена модули, которые вы хотите импортировать с импортом *, так что мы снова рассмотрим наш вышеприведенный пример, если хотим импортировать подмодули в подпакету, переменная __all__ в subpackage/__init__.py будет:

__all__ = ['submodule1', 'submodule2']

С помощью __all__, так что, когда вы выполняете

from subpackage import *

, он будет импортировать подмодуль1 и подмодуль2.

Как вы можете видеть, __init__.py может быть очень полезным, кроме его основной функции указывает, что каталог является модулем.

Ссылка

29
ответ дан Chirag Maliwal 1 September 2018 в 10:39
поделиться

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

Для людей, которые предпочитают читать код, я помещаю здесь комментарий Two-Bit Alchemist .

$ find /tmp/mydir/
/tmp/mydir/
/tmp/mydir//spam
/tmp/mydir//spam/__init__.py
/tmp/mydir//spam/module.py
$ cd ~
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
>>> module.myfun(3)
9
>>> exit()
$ 
$ rm /tmp/mydir/spam/__init__.py*
$ 
$ python
>>> import sys
>>> sys.path.insert(0, '/tmp/mydir')
>>> from spam import module
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named spam
>>> 
48
ответ дан Community 1 September 2018 в 10:39
поделиться

Файлы с именем __init__.py используются для маркировки каталогов на диске в виде каталогов пакетов Python. Если у вас есть файлы

mydir/spam/__init__.py
mydir/spam/module.py

и mydir на вашем пути, вы можете импортировать код в module.py в качестве

import spam.module

или

from spam import module

Если вы удалите файл __init__.py, Python больше не будет искать подмодули внутри этого каталога, поэтому попытки импортировать модуль не удастся.

Файл __init__.py обычно пуст, но может использоваться для экспорта выбранных частей пакета под более удобным именем, удержания удобных функций и т. д. В приведенном выше примере к содержимому модуля init можно получить доступ как

import spam

на основе это

602
ответ дан Jordi Vicens 1 September 2018 в 10:39
поделиться

Он облегчает импорт других файлов python. Когда вы помещаете этот файл в каталог (например, материал), содержащий другие файлы py, тогда вы можете сделать что-то вроде import stuff.other.

root\
    stuff\
         other.py

    morestuff\
         another.py

Без этого __init__.py внутри материала каталога вы могли бы 't import other.py, потому что Python не знает, где исходный код для материала и не может распознать его как пакет.

25
ответ дан Matt Fenwick 1 September 2018 в 10:39
поделиться

Помимо маркировки каталога как пакета Python и определения __all__, __init__.py позволяет вам определять любую переменную на уровне пакета. Это часто бывает удобно, если пакет определяет что-то, что будет импортироваться часто, в стиле API.

Пример

Вот пример из одного из моих проектов, в котором я часто импортирую файл sessionmaker Session, чтобы взаимодействовать с моей базой данных. Я написал пакет «database» с несколькими модулями:

database/
    __init__.py
    schema.py
    insertions.py
    queries.py

Мой __init__.py содержит следующий код:

import os

from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

engine = create_engine(os.environ['DATABASE_URL'])
Session = sessionmaker(bind=engine)

Так как я определяю Session здесь, я может начать новый сеанс, используя синтаксис ниже. Этот код был бы таким же выполненным изнутри или вне каталога пакета базы данных.

from database import Session
session = Session()

Конечно, это небольшое удобство - альтернативой было бы определить Session в новый файл типа «create_session.py» в моем пакете базы данных и начать новые сеансы, используя:

from database.create_session import Session
session = Session()

Дальнейшее чтение

Существует довольно интересная красноватая нить, охватывающая соответствующие применения __init__.py здесь:

http://www.reddit.com/r/Python/comments/1bbbwk/whats_your_opinion_on_what_to_include_in_init_py/

Мнение большинства кажется что файлы __init__.py должны быть очень тонкими, чтобы не нарушать философию «явный, а не скрытый».

368
ответ дан Nathan Gould 1 September 2018 в 10:39
поделиться

Для __init__.py

  1. есть две основные причины. Для удобства: другим пользователям не нужно знать точное местоположение ваших функций в иерархии пакетов.
    your_package/
      __init__.py
      file1.py/
      file2.py/
        ...
      fileN.py
    
    # in __init__.py
    from file1 import *
    from file2 import *
    ...
    from fileN import *
    
    # in file1.py
    def add():
        pass
    
    , тогда другие могут вызывать add () с помощью
    from your_package import add
    
    без знания файла1, например
    from your_package.file1 import add
    
  2. . Если вы хотите, чтобы что-то было инициализировано; например, каротаж (который должен быть помещен на верхний уровень):
    import logging.config
    logging.config.dictConfig(Your_logging_config)
    
106
ответ дан Ninjakannon 1 September 2018 в 10:39
поделиться

В 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 контенту.

45
ответ дан Ryan Hiebert 1 September 2018 в 10:39
поделиться

Хотя Python работает без файла __init__.py, вы все равно должны его включать.

Он указывает, что пакет следует рассматривать как модуль, поэтому включите его (даже если он пуст).

Существует также случай, когда вы действительно можете использовать файл __init__.py:

Представьте, что у вас была следующая файловая структура:

main_methods 
    |- methods.py

И methods.py содержал это:

def foo():
    return 'foo'

Чтобы использовать foo(), вам понадобится одно из следующих:

from main_methods.methods import foo # Call with foo()
from main_methods import methods # Call with methods.foo()
import main_methods.methods # Call with main_methods.methods.foo()

Возможно, вам нужно (или хотите ), чтобы сохранить methods.py внутри main_methods (например, время выполнения / зависимости), но вы хотите импортировать main_methods.


Если вы изменили имя methods.py на __init__.py то вы можете использовать foo(), просто импортировав main_methods:

import main_methods
print(main_methods.foo()) # Prints 'foo'

Это работает, потому что __init__.py рассматривается как часть пакета.


Некоторые Python пакеты действительно делают это. Например, JSON , где запуск import json фактически импортирует __init__.py из пакета json (, см. Структуру файла пакета здесь ):

Исходный код: Lib/json/__init__.py

6
ответ дан Simon 1 September 2018 в 10:39
поделиться

Поскольку Python 3.3, __init__.py больше не требуется определять каталоги как импортируемые пакеты Python.

Проверить PEP 420: Неявные пакеты пространства имен :

Встроенная поддержка каталогов пакетов, для которых не требуются файлы маркеров __init__.py и может автоматически охватывать несколько сегментов маршрута (вдохновленные различными сторонними подходами к пакетам пространства имен, как описано в PEP 420 )

Вот тест:

$ mkdir -p /tmp/test_init
$ touch /tmp/test_init/module.py /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
├── module.py
└── __init__.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

$ rm -f /tmp/test_init/__init__.py
$ tree -at /tmp/test_init
/tmp/test_init
└── module.py
$ python3

>>> import sys
>>> sys.path.insert(0, '/tmp')
>>> from test_init import module
>>> import test_init.module

ссылки: https://docs.python.org/3/whatsnew/3.3.html#pep- 420-implicit-namespace-packages https://www.python.org/dev/peps/pep-0420/ Является ли __init__.py не обязательным для пакетов в Python 3 ?

48
ответ дан Community 3 September 2018 в 08:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: