#python python... PYTHON 🔛 🚀
11 subscribers
914 photos
7 videos
158 files
1.54K links
Download Telegram
Джейкоб Каплан-Мосс: среда разработки Python, 2020 изд.
Ведущий разработчик Django Джейкоб Каплан-Мосс поделился различными настройками среды разработки Python.

1. pyenv
Почему? Для тех моментов, когда нужно запустить несколько версий Python, изолированных от системы Python. pyenv облегчает установку, управление и переключение между этими несколькими питонами.

2. pipx
Почему? pipx позволяет установить основанный на Python интерфейс CLI (youtube-dl, awscli, doc2dash и т. д.), чтобы зависимости этих проектов не испортили глобальный Python.

3. Poetry
Почему? Poetry обрабатывает управление зависимостями и виртуальной средой очень интуитивно и идеально подходит для желаемого рабочего процесса.
Forwarded from Python Learning
Метрики кода. Почему метрики кода важны?
Метрики кода могут быть получены с помощью инструментов статического анализа кода для определения сложности и нестандартных практик.

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

Проекты с открытым исходным кодом

Radon — это инструмент для получения необработанных метрик на счетчиках линий, метрик цикломатической сложности, метрик Холстеда и метрик ремонтопригодности.

Pylint содержит средства проверки соответствия стиля кода PEP8, дизайна, исключений и многих других инструментов анализа исходного кода.

PyFlakes анализирует исходные файлы на наличие ошибок и сообщает о них.

Pyntch — это статический анализатор кода, который пытается обнаружить ошибки во время выполнения. Он не выполняет проверку стиля кода.

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

Flake8 — это средство обеспечения соблюдения правил в формате кода. Его целью является не сбор метрик, а обеспечение единого стиля во всех ваших программах на Python для максимальной читабельности. Правила для Flask8 все определены в этом списке , который сворачивает зависимости Flake8 от pycodestyle, pyflakes и McCabe.

Black — это средство форматирования кода Python с сильными, бескомпромиссными предположениями о том, как ваш код должен быть отформатирован.

Dlint является носителем для безопасного кодирования.

pylintdb помещает результаты pylint в базу данных SQLite для программного доступа и поиска. Нед Бэтчелдер написал его и написал о том, как он использует программу в этом инструменте командной строки размером с кусочек: сообщение pylintdb .

Flask8-eradicate ( исходный код ) — это плагин Flask8 для определения мертвого кода.

Службы метрик размещенного кода
Следующие инструменты готовы к использованию, перейдя в службу, введя URL-адрес вашего сайта, позволив им выполнить анализ и затем прочитав результаты.

Coveralls показывает покрытие кода из наборов тестов и других метрик, чтобы помочь разработчикам улучшить качество своего кода.

webhint, ранее Sonarwhal, сканирует ваш сайт на предмет доступности, скорости и безопасности. Существует как онлайн-версия, на которую вы можете указать произвольный URL, так и версия для командной строки для запуска самостоятельно.

Codecov подключается к GitHub, BitBucket или GitLab и сообщает о покрытии кода в ваших хранилищах кода.
Python Tricks (2017)
Автор: Dan Bader

#python #book #en

Язык: English.

Целевая аудитория: для начинающих и опытных разработчиков.

С помощью этой книги вы познакомитесь с лучшими практиками Python на простых, но практичных примерах. Вы станете на один шаг ближе к освоению Python, так что вы сможете написать красивый и идиоматический код, который вам придет естественным образом.

В книге рассматриваются следующие темы:
✔️ шаблоны для чистого Python;
✔️ эффективные функции;
✔️ классы и ООП;
✔️ общие структуры данных в Python;
✔️ циклы и итерации и многое другое.

Преимущества:
помогает перейти на следующий уровень;
краткое резюме после каждого раздела;
простые и практичные предложения.

Недостатки:
не обнаружено.
С 18 по 20 ноября в 20:00 пройдёт бесплатный интенсив по Python.

Регистрация уже началась: https://clc.to/xu2W8g

🐍 За три дня ты создашь программу для обмена быстрыми сообщениями и освоишь востребованный среди работодателей язык программирования!

Количество бесплатных мест ограниченно!

🎈 За участие ты получишь подарки от компаний Skillbox и EnglishDom.
Forwarded from Artem Borzilov
Я уже многожды рекламировал и порекламирую еще раз в этом чате https://docs.python-guide.org/ — фактически мануал по экосистеме, который курирует тот же kenneth reitz
#python python... PYTHON 🔛 🚀
#cool #python #books #from t.me/Tylorn #Tylorn - #DMIA #teacher
‘’’

Item 24: Use @classmethod Polymorphism to Construct
Objects Generically
In Python, not only do the objects support polymorphism, but the classes do as well. What does that mean, and what is it good for?
Polymorphism is a way for multiple classes in a hierarchy to implement their own unique versions of a method. This allows many classes to fulfill the same interface or abstract base class while providing different functionality (see Item 28: “Inherit from collections.abc for Custom Container Types” for an example).
For example, say you’re writing a MapReduce implementation and you want a common class to represent the input data. Here, I define such a class with a read method that must be defined by subclasses:
Click here to view code image
class InputData(object):
def read(self):
raise NotImplementedError
Here, I have a concrete subclass of InputData that reads data from a file on disk:
Click here to view code image
class PathInputData(InputData): def __init__(self, path):
super().__init__() self.path = path
def read(self):
return open(self.path).read()
You could have any number of InputData subclasses like PathInputData and each of them could implement the standard interface for read to return the bytes of data to process. Other InputData subclasses could read from the network, decompress data transparently, etc.
You’d want a similar abstract interface for the MapReduce worker that consumes the input data in a standard way.
Click here to view code image
class Worker(object):
def __init__(self, input_data):
self.input_data = input_data self.result = None

def map(self):
raise NotImplementedError
def reduce(self, other):
raise NotImplementedError
Here, I define a concrete subclass of Worker to implement the specific MapReduce function I want to apply: a simple newline counter:
Click here to view code image
class LineCountWorker(Worker):
def map(self):
data = self.input_data.read() self.result = data.count(‘\n’)
def reduce(self, other): self.result += other.result
It may look like this implementation is going great, but I’ve reached the biggest hurdle in all of this. What connects all of these pieces? I have a nice set of classes with reasonable interfaces and abstractions—but that’s only useful once the objects are constructed. What’s responsible for building the objects and orchestrating the MapReduce?
The simplest approach is to manually build and connect the objects with some helper functions. Here, I list the contents of a directory and construct a PathInputData instance for each file it contains:
Click here to view code image
def generate_inputs(data_dir):
for name in os.listdir(data_dir):
yield PathInputData(os.path.join(data_dir, name))
Next, I create the LineCountWorker instances using the InputData instances
returned by generate_inputs. Click here to view code image
def create_workers(input_list): workers = []
for input_data in input_list: workers.append(LineCountWorker(input_data))
return workers
I execute these Worker instances by fanning out the map step to multiple threads (see Item 37: “Use Threads for Blocking I/O, Avoid for Parallelism”). Then, I call reduce repeatedly to combine the results into one final value.
Click here to view code image
def execute(workers):
threads = [Thread(target=w.map) for w in workers] for thread in threads: thread.start()
for thread in threads: thread.join()
first, rest = workers[0], workers[1:]
for worker in rest:
first.reduce(worker) return first.result

Finally, I connect all of the pieces together in a function to run each step.
Click here to view code image
def mapreduce(data_dir):
inputs = generate_inputs(data_dir) workers = create_workers(inputs) return execute(workers)
Running this function on a set of test input files works great.
Click here to view code image
from tempfile import TemporaryDirectory def write_test_files(tmpdir):
#...
#python python... PYTHON 🔛 🚀
#cool #python #books #from t.me/Tylorn #Tylorn - #DMIA #teacher
with TemporaryDirectory() as tmpdir: write_test_files(tmpdir)
result = mapreduce(tmpdir)
print(‘There are’, result, ‘lines’)
>>>
There are 4360 lines
What’s the problem? The huge issue is the mapreduce function is not generic at all. If you want to write another InputData or Worker subclass, you would also have to rewrite the generate_inputs, create_wor

‘’’
​​☝🏻Сегодня, 27 ноября в 20:00 мск приглашаем на День открытых дверей курса «Инфраструктурная платформа на основе Kubernetes»: https://otus.pw/I9Dj/

📌На бесплатном вебинаре:
- вы познакомитесь с преподавателем-практиком Юрием Игнатовым, ведущим инженером Express42;
- сможете задать любые вопросы по Kubernetes;
- узнаете подробнее о хардкорной программе курса, формате обучения и выпускном проекте;
- расскажем о карьерных перспективах.

🔥Чёрная пятница уже началась - чтобы попасть на курс со скидкой 30%, пройдите вступительный тест (честно - дешевле уже не будет): https://otus.pw/vh6f/