Python package init all

Python Packages – Creating and Accessing

Python packages help us to manage modules and python scripts. They are normal directories with a init script – __init__.py.

How to Create a Python Package?

We can create a package by following below steps.

  1. Create the package directory – we can use terminal or Python IDE for this.
  2. Create __init__.py file – this is required to convert a normal directory into python package. This file is used to initialize the package and list all the modules. In the simplest form, this file can be empty.

What can we keep in a Python Package?

  • The initialization file
  • Python modules
  • Python scripts
  • Any other type of files

So in general, a package just like is a directory in our computer systems. The only difference is the mandatory inclusion of the __init__.py file.

Can we Create sub-packages in Python?

Yes, we can create a package inside another package. We have to follow the packaging rules to create a sub-package too.

Python Package Examples

Let’s look into some examples of creating and using packages.

1. Creating a Package

$ mkdir utilities $ touch utilities/__init__.py $ mkdir utilities/strings $ mkdir utilities/strings/__init__.py $ tree . └── utilities ├── __init__.py └── strings └── __init__.py 3 directories, 1 file $

Python Packages

2. Adding Modules to the Package

Let’s say we have two python modules – math.py and str_utils.py. They have few functions that will be used in our program.

def add(x, y): return x + y def multiply(x, y): return x * y

str_utils.py:

def to_uppercase(s): s = str(s) return s.upper() def reverse(s): s = str(s) return s[::-1]

We want to add these modules to our packages. Just copy these files to the packages directory where you want to keep these modules.

$ ls math.py str_utils.py utilities $ mv math.py utilities $ mv str_utils.py utilities/strings $ tree . └── utilities ├── __init__.py ├── math.py └── strings ├── __init__.py └── str_utils.py 3 directories, 3 files $

Adding Modules To Python Package

3. Importing Modules from a Package

The syntax to import a python module inside a package is:

import package.sub_package1.sub_package2.module import package.sub_package1.sub_package2.module as module

Python uses sys.path variable to search for packages and modules. The current directory is part of the sys.path variable. So we will keep our python script in the python-packages directory. Otherwise, we will have to add the package location in the sys.path variable.

$ cat my_script.py import sys print(sys.path) $ python3.7 my_script.py ['/Users/pankaj/Desktop/python-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'] $

Here is the my_script.py code to access the modules from the packages and calling their functions.

import utilities.math as math import utilities.strings.str_utils as str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

Importing Package Module In Python

We can also import a module using below syntax:

from package.sub_package1.sub_package2 import module

Here is the updated example to access “math” and “str_utils” module in our program.

from utilities import math from utilities.strings import str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

Python From Package Import Module

4. Import * from a package

We can import every module from a package using the following syntax.

from package.sub_package1.sub_package2 import *

In this case, Python searches sub_package2 for packages, modules, and functions. This can produce side effects by importing something that you don’t want to. Also, it’s a very time taking process.

We can define a list of modules to be imported by creating __all__ variable in the __init__.py file.

utilities/__init__.py:

print('utilities package initialized') __all__ = ['math']

utilities/strings/__init__.py:

print('utilities.strings package initialized') __all__ = ['str_utils']

The updated my_script.py code is:

from utilities import * from utilities.strings import * print(math.add(10, 20)) print(str_utils.reverse("ABC"))
$ python3.7 my_script.py utilities package initialized utilities.strings package initialized 30 CBA

Python Package Init File All Modules List

Notice that the python code in the __init__.py gets executed first when the packages are initialized and imported.

How to add a Package to the System Path

It’s not feasible to always depend on the directory hierarchy to import package modules. We can add our custom package to the sys.path variable and then import them in any script.

import sys sys.path.append("/Users/pankaj/Desktop/python-packages") print(sys.path) import utilities.math as math print(math.add(1, 2))
$ python3.7 my_script.py ['/Users/pankaj', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Users/pankaj/Desktop/python-packages'] utilities package initialized 3 $

Conclusion

Packages in Python allow us to divide our application modules and scripts into logical modules. This keeps our code base clean and easy to maintain.

References:

Источник

Пакеты (package) в Python. Вложенные пакеты

На этом занятии речь пойдет о пакетах, узнаем, как их создавать и импортировать. Ранее мы с вами уже говорили о модулях – отдельных файлах с текстами программ, которые можно импортировать в другие программы. А пакет (package) – это специальным образом организованный подкаталог с набором модулей, как правило, решающих сходные задачи.

def get_html(): print("курс по HTML")
def get_java(): print("Курс по Java")
def get_php(): pass def get_mysql(): pass
def get_python(): print("курс по Python")

И обратите внимание. Для корректной обработки модулей в пакете, все файлы следует создавать с кодировкой UTF-8. Все, мы сформировали пакет и теперь можем его импортировать в нашу программу. Для этого записывается ключевое слово import и указывается имя пакета (название подкаталога):

Мы видим имя нашей переменной NAME и вспомогательные переменные, которые были созданы автоматически средой Python: [‘NAME’, ‘__builtins__’, ‘__cached__’, ‘__doc__’, ‘__file__’, ‘__loader__’, ‘__name__’, ‘__package__’, ‘__path__’, ‘__spec__’] Выведем значение переменной NAME:

И в консоли отображается строчка, прописанная в файле __init__.py. О чем это говорит? О том, что при импорте пакета файл __init__.py был выполнен. В действительности – это инициализатор пакета. В нем мы прописываем то, что следует импортировать при импорте пакета. Например, в нашем каталоге courses присутствуют четыре наших файла, но ни один из них не был использован в момент импорта. Это произошло, как раз, по той причине, что в файле __init__.py мы их никак не обрабатывали. Чтобы получить доступ к функциям из модулей внутри пакета, их, в свою очередь, нужно импортировать в инициализаторе __init__.py, например, так:

Я, думаю, вы понимаете, почему вначале указан подкаталог courses? Так как модули находятся по нестандартному пути, то этот путь следует явно прописать. В данном случае, достаточно указать имя подкаталога, а затем, через точку имя файла. Теперь, после запуска программы, мы видим, что в пространстве имен пакета courses появилось имя python. Поэтому, мы можем обратиться к этому модулю и вызвать его функцию:

from courses.python import get_python

Но, все же, у такого способа импортирования модулей в инициализаторе пакета есть один существенный недостаток – мы, фактически, указываем полный путь к модулю (это называется абсолютным импортом). Представьте, например, что в будущем, по каким-либо причинам, придется поменять название пакета. Тогда и все абсолютные импорты также придется переписывать. Поэтому здесь лучше воспользоваться относительным способом импортирования. Для этого, вместо имени основного подкаталога courses, ставится точка:

from .python import get_python

Эта точка означает «использовать текущий каталог». Так гораздо практичнее и мы теперь совершенно не привязаны к названию пакета. Или, можно записать так:

from . import html, java, php, python

тогда импортируем все модули в текущем пакете. Но, мы вернем прежний импорт и запишем его со звездочкой для получения всех данных из файла:

Ранее, я вам говорил, что в программах так лучше не делать. Однако, внутри пакетов делают – это исключение из общего правила. Почему такой импорт целесообразен? Дело в том, что модули внутри пакетов постоянно совершенствуются. Появляются новые функции, переменные, классы. И, чтобы каждый раз не менять их список в импорте, прописывают звездочку, так удобнее. При этом конфликта имен можно избежать, контролируя импортируемые данные. Для этого внутри модуля прописывается специальная переменная __all__ со списком импортируемых данных, если используется оператор *. Например, если в модуле php.py, прописать:

__all__ = ['get_php', 'get_mysql']
courses.get_php() courses.get_mysql()

то прежняя программа выполнится с ошибками, так как вторая функция не была импортирована. Эту же коллекцию __all__ можно записывать и в инициализаторе, например, так:

from .python import * from .php import * NAME = "package courses" __all__ = ['python', 'php']

Тогда модули python и php импортируются, а переменная NAME нет. И последнее, о чем я, думаю, следует сказать – это возможность создавать вложенные пакеты. Делается это очевидным образом, создаем еще один вложенный каталог, например, с именем: doc через PyCharm (также). И, далее, разместим в этом вложенном пакете два файла: java_doc.py:

doc = """Документация по языку Java"""
doc = """Документация по языку Python"""
from . import python_doc, java_doc
print(courses.python_doc.doc)

Мало того, в самих модулях вложенного пакета можно обращаться к модулям внешнего пакета. Для этого следует при импорте указать две точки (переход во внешний каталог) и далее имя модуля, например (в файле python_doc.py):

from ..python import get_python
doc = """Документация по языку Python: """ + get_python()
def get_python(): return "курс по Python"

Источник

Читайте также:  Все о html canvas
Оцените статью