Фишки Python
29 subscribers
2 photos
3 files
29 links
Всё что ты хотел узнать, но ленился спросить.

Декораторы, итераторы и контракты.
Download Telegram
Channel created
Channel photo updated
Первая строка в модуле сохраняется в атрибут __doc__ - он же docstring
import m
m.__name__ == "m"
m.__doc__ == "Module m"
m.__file__ == "./m.py"
m.__cached__ == "./__pycache__/m.cpython-36.pyc"
if __name__ == "__main__":
print("The best place for unit testing your module.")
from mathplotlib import plot_histogram as hist

hist всего лишь ссылка на <function mathplotlib.plot_histogram>
from ... import *
Не стоит так писать даже если в модуле указан __all__ = [...] с перечислением только определенных импортируемых функций и атрибутов
В момент импорта модуль исполняется полностью сверху вниз (даже если импортируем только одну функцию)
PEP8 рекомендует импортировать руководствуясь следующими правилами:
1) сначала импортируем модули стандартной библиотеки
2) модули других проектов/библиотек/разработчиков
3) модули текущего проекта
4) __all__, __version__, __author__ - указываем после docstring, но до импорта каких-либо модулей
Пакет - любая директория с файлом __init__.py
import packet.module
При импорте модуля из пакета, пакет появляется в области видимости на равне с модулем
from packet import module
Не засоряет область видимости именем пакета
__parent__ - родитель текущего модуля
from ..foo import something
импортирует из модуля foo родительского пакета текущего пакета функцию/атрибут something
Паттерн фасад для организации работы с пакетом пакетов без необходимости вникать во внутреннюю структуру пакета:

# useful/bar/__init__.py
from .boo import *
__all__ = boo.__all__

# useful/__init__.py
from .foo import *
from .bar import *
__all__ = foo.__all__ + bar.__all__
$ python -m useful
Выполнит код __main__.py сразу после инициализации __init__.py из пакета useful