Основы Python: модули в Python

Python

Введение

Интерпретируемая среда Python очень полезна, но если нам нужно написать большую программу, интерпретируемой среды совершенно недостаточно. На данный момент нам нужно сохранить программу Python в файл. Обычно этот файл заканчивается на .py.

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

Модуль — это файл, содержащий определения и операторы Python. Имя файла — это имя модуля, за которым следует суффикс файла..py. Внутри модуля имя модуля можно передать через глобальную переменную__name__получить.

Основы модуля

Или предыдущий пример последовательности Фибоначчи, реализацию функции мы храним в файле fibo.py:


def fib(n):    # write Fibonacci series up to n
    a, b = 0, 1
    while a < n:
        print(a, end=' ')
        a, b = b, a+b
    print()

После написания мы можем импортировать его в интерпретируемую среду Python:

>>> import fibo

Затем используйте его напрямую:

>>> fibo.fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Часто используемые функции, мы можем присвоить их переменной:

>>> fib = fibo.fib
>>> fib(1000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

Или, когда мы импортируем, даем модулю имя напрямую:

>>> import fibo as fib
>>> fib.fib(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

Или импортируйте функцию в модуль:

>>> from fibo import fib as fibonacci
>>> fibonacci(500)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

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

исполнительный модуль

Ранее мы упоминали, что вы можете использовать import для импорта модуля, и__name__Хранится в имени модуля.

Как и основной метод в java, если мы хотим провести некоторое тестирование в модуле, есть ли способ написать основной метод в java?

Давайте посмотрим на пример:

if __name__ == "__main__":
    import sys
    fib(int(sys.argv[1]))

В модуле нам нужно вынести суждение__name__назначается как"__main__".

Мы выполняем этот модуль следующим образом:

python fibo.py <arguments>

В случае выполнения скрипта модуль__name__свойство будет присвоено как__main__, поэтому пример написан так.

Взгляните на эффект исполнения:

$ python fibo.py 50
0 1 1 2 3 5 8 13 21 34

Если импортировать как модуль, он не будет выполнен:

>>> import fibo
>>>

путь поиска модуля

При импорте модуля с помощью import интерпретатор сначала будет искать встроенный модуль с таким именем, и если не будет найден, интерпретаторsys.pathПосмотрите в списке каталогов, заданных переменной.

sys.pathНачальный каталог включает:

  • Текущий каталог
  • Каталог, указанный PYTHONPATH
  • Установленные значения по умолчанию

dir

Чтобы увидеть, что определено в модуле, используйте функцию dir.

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir()
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']

В приведенном выше примере перечислено то, что определено в текущем модуле, включая переменные, модули, функции и т. д.

Уведомление,dir()Имена встроенных функций и переменных не указаны. Если вам это нужно, их определения находятся в стандартном модуле.builtinsсередина.

Мы можем добавить параметры в каталог, чтобы получить содержимое определенного модуля:

>>> import builtins
>>> dir(builtins)  
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
 'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
 'NotImplementedError', 'OSError', 'OverflowError',
 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__',
 '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs',
 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
 'zip']

Сумка

В java есть понятие пакета, которое используется для изоляции программного кода. Точно так же есть пакеты в Python.

Давайте посмотрим на пример пакета в Python:

sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage for file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  Subpackage for sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  Subpackage for filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

Выше мы определили 4 пакета, а именно звук, звук.форматы, звук.эффекты, звук.фильтры.

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

__init__.pyМожет быть пустым файлом или выполнять код инициализации пакета или установку.__all__Переменная.

При импорте python будетsys.pathпуть для поиска пакета.

Есть много способов импортировать пакеты, мы можем импортировать один модуль:

import sound.effects.echo

Но после такого импорта вы должны загрузить полное имя при его использовании:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

Если вы не хотите загружать полное имя, вы можете импортировать его следующим образом:

from sound.effects import echo

Затем его можно использовать следующим образом:

echo.echofilter(input, output, delay=0.7, atten=4)

Вы также можете напрямую импортировать методы в модули:

from sound.effects.echo import echofilter

Затем используйте так:

echofilter(input, output, delay=0.7, atten=4)

Если в пакете много подпакетов, мы можем использовать * для одновременного импорта:

 from sound.effects import * 

Так как же контролировать, какой подпакет эффектов будет импортирован?

мы можем__init__.pyопределить именованный__all__Список имен подпакетов, которые будут экспортированы, указан в этом списке следующим образом:

__all__ = ["echo", "surround", "reverse"]

такfrom sound.effects import *будет импортироватьsoundТри именованных подмодуля пакета.

если не определено__all__,from sound.effects import *утверждениеНе будуиз пакетаsound.effectsимпортировать все подмодули в текущее пространство имен; будут импортированы только пакетыsound.effects.

относительный путь к пакету

Импорт может указывать относительные пути, мы используем . для представления текущего пакета и .. для представления родительского пакета.

Следующее:

from . import echo
from .. import formats
from ..filters import equalizer

Эта статья была включена вwoohoo.floydpress.com/07-python-no…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!