LINUX.ORG.RU

Python 3.7

 


5

8

Спустя полтора года после выхода предыдущей мажорной версии, наконец-то состоялся релиз Python 3.7.

В этом выпуске

  • Улучшена поддержка аннотации типов
  • Data classes
  • Атрибуты модулей
  • Отладка с помощью breakpoint()
  • И многое другое

PEP 563, Отложенное исполнение аннотаций типов

Теперь аннотации разрешаются в момент вызова функции, а не в момент загрузки её кода. Это уменьшает время старта программы и делает доступным использование имён, определённых позднее самой функции (forward references).

Такой код вызывал бы ошибку в предыдущих версиях Python

class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...

Это изменение нарушает совместимость, поэтому до прихода версии Python 4.0 пока требует

from __future__ import annotations

PEP 553, Встроенная функция breakpoint()

Отладка стала ещё проще! Допустим, у вас есть такой код

def divide(e, f):
    return f / e

a, b = 0, 1
print(divide(a, b))

В предыдущих версиях для отладки вам требовалось:

def divide(e, f):
    import pdb; pdb.set_trace()
    return f / e

В 3.7 это выглядит проще и короче

def divide(e, f):
    breakpoint()
    return f / e

Теперь запускайте ваш код:

$ python3.7 bugs.py 
> /home/gahjelle/bugs.py(3)divide()
-> return f / e
(Pdb)

По умолчанию breakpoint() просто заменяется на import pdb; pdb.set_trace(), однако это можно изменить. Скажем, вы можете использовать другой отладчик:

$ PYTHONBREAKPOINT=pudb.set_trace python3.7 bugs.py
Или отключить отладку вовсе
$ PYTHONBREAKPOINT=0 python3.7 bugs.py
ZeroDivisionError: division by zero
Или запустить IPython
$ PYTHONBREAKPOINT=IPython.embed python3.7 bugs.py 
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: print(e / f)
0.0
В конечном счёте, вы можете написать свой собственный обработчик breakpoint()

PEP 557, Data Classes

Новый модуль dataclasses делает более удобным написание классов, основная задача которых — хранить данные. Вы просто используете декоратор, и весь бойлерплейт пишется за вас.

from dataclasses import dataclass, field

@dataclass(order=True)
class Country:
    name: str
    population: int
    area: float = field(repr=False, compare=False)
    coastline: float = 0

    def beach_per_person(self):
        """Meters of coastline per person"""
        return (self.coastline * 1000) / self.population

Методы __init__, __repr__, __eq__, __ne__, __lt__, __le__, __gt__, __ge__ будут сгенерированы автоматически для класса Country

PEP 562, Кастомизация атрибутов модулей

Вы уже давно знакомы с __getattr__ для классов. Теперь этот метод может быть определён и для модулей. Типичные примеры использования: сообщить о том, что некоторая функция в модуле объявлена deprecated, а также ленивая загрузка тяжелых подмодулей.

PEP 564, Временны́е функции с наносекундным разрешением

Улучшен модуль time, добавлено несколько новых функций

time.clock_gettime_ns()
time.clock_settime_ns()
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
Точность расчёта временных интервалов повышена до наносекунд

Упорядоченные словари

Порядок ключей в словарях теперь гарантированно совпадает с порядком их вставки, это добавлено в спецификацию.

>>> {"one": 1, "two": 2, "three": 3}  # Python <= 3.5
{'three': 3, 'one': 1, 'two': 2}

>>> {"one": 1, "two": 2, "three": 3}  # Python >= 3.6
{'one': 1, 'two': 2, 'three': 3}

Это работало ещё с версии 3.6, однако опиралось на внутреннюю реализацию словарей CPython, и полагаться на такой порядок было нельзя.

Новые ключевые слова: async и await

Корутины с async и await были введены в Python 3.5, однако для обратной совмесимости всё ещё можно было объявить переменные с такими именами. Теперь это будет выдавать ошибку.

>>> async = 1
  File "<stdin>", line 1
    async = 1
          ^
SyntaxError: invalid syntax

>>> def await():
  File "<stdin>", line 1
    def await():
            ^
SyntaxError: invalid syntax

Улучшение модуля asyncio

Модуль asyncio для поддержки асинхронности был представлен в Python 3.4 (введение). В Python 3.7 asyncio получил большое количество новых функций, поддержку контекстных переменных и улучшения производительности. Например, используя asyncio.run(), вы можете легко вызывать корутины из синхронного кода, не создавая event loop.

import asyncio

async def hello_world():
    print("Hello World!")

asyncio.run(hello_world())

PEP 567, Контекстные переменные

Контекстные переменные — это переменные, которые могут иметь различные значения в зависимости от окружения. Они похожи на Thread-Local Storage, в которых каждый исполняемый тред может иметь разное значение переменной, однако контекстные переменные могут иметь разные значение даже в пределах одного треда. Основная область применения — параллельные асинхронные задачи.

import contextvars

name = contextvars.ContextVar("name")
contexts = list()

def greet():
    print(f"Hello {name.get()}")

# Construct contexts and set the context variable name
for first_name in ["Steve", "Dina", "Harry"]:
    ctx = contextvars.copy_context()
    ctx.run(name.set, first_name)
    contexts.append(ctx)

# Run greet function inside each context
for ctx in reversed(contexts):
    ctx.run(greet)

Запуск скрипта приветствует Steve, Dina, и Harry в обратном порядке:

$ python3.7 context_demo.py
Hello Harry
Hello Dina
Hello Steve

Импорт файлов с данными с помощью importlib.resources

Как происходила упаковка ресурсов в пакет до Python 3.7? Обычно выбирали один из трёх способов

  • Захардкоженные пути к ресурсам
  • Поместить файлы внурь пакета и получать к ним доступ с помощью __file__
  • Использовать setuptools.pkg_resources

Первый способ не портируем. Второй подходит лучше, но если Python-пакет находится внутрь zip архива, то там не будет атрибута __file__, что создает проблемы. Третий способ работает, однако слишком медленный.

Теперь появляется ещё один способ: новый модуль importlib.resources в стандартной библиотеке. Он использует уже существующую функциональность импорта модулей для загрузки файлов. Допустим, у вас есть ресурсы внутри пакета:

data/
│
├── alice_in_wonderland.txt
└── __init__.py

Теперь вы можете получить доступ к alice_in_wonderland.txt следующим образом:

>>> from importlib import resources
>>> with resources.open_text("data", "alice_in_wonderland.txt") as fid:
...     alice = fid.readlines()
... 
>>> print("".join(alice[:7]))
CHAPTER I. Down the Rabbit-Hole

Alice was beginning to get very tired of sitting by her sister on the
bank, and of having nothing to do: once or twice she had peeped into the
book her sister was reading, but it had no pictures or conversations in
it, ‘and what is the use of a book,’ thought Alice ‘without pictures or
conversations?’

Похожая функция resources.open_binary() открывает файлы в бинарном режиме.

Оптимизации

Ни один релиз Python не обходится без набора оптимизаций. Python 3.7 не стал исключением:

  • Снижены накладные расходы при вызове многих методов из стандартной библиотеки
  • В целом методы теперь вызываются на 20% быстрее
  • Время запуска самого Python снижено на 10-30%
  • Импортирование typing теперь быстрее в 7 раз.

Различные лучшения CPython

  • Уход от ASCII как от дефолтной кодировки:
  • PEP 552, Воспроизводимые .pycs
  • Новая опция -X
    $ python3.7 -X importtime my_script.py
    import time: self [us] | cumulative | imported package
    import time:      2607 |       2607 | _frozen_importlib_external
    ...
    import time:       844 |      28866 |   importlib.resources
    import time:       404 |      30434 | plugins
    
    Вы также можете использовать -X dev для активации «режима разработки» и -X utf8 для активации режима UTF-8. Полный список опций.
  • PEP 565, улучшенная обработка DeprecationWarning

Новость на Real Python

>>> Официальный обзор изменений

★★★★★

Проверено: tailgunner ()
Последнее исправление: tailgunner (всего исправлений: 5)

Ответ на: комментарий от Ende

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

Ну, каждому своё. Кому-то — успешные проекты, кому-то — радость от созерцания своей крутизны.

ugoday ★★★★★
()
Ответ на: комментарий от Rodegast

Давай пример более менее сложного алгоритма с многопоточностью, который имеет смысл иметь в питоне, пожалуйста. Авось на выходных потренеруюсь.

Возьми текстовый файл который содержит 1000000 строк. Первым потоком этот файл нужно считывать в список, вторым потоком удалять из этого списка строки(,) которые содержат определённое значение, а третьим сортировать его. Конечно же всё это должно происходить одновременно. Как видишь пока ничего сложного, как с этой задачей справишься, я тебе что нибудь посложнее придумаю.

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

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

p.s. никогда не занимался отладкой потоков и не читал про них

anonymous
()
Ответ на: комментарий от ugoday

Что значит «крутизна»? Давай вот по пунктам, если ты считаешь что питон хороший язык для промышленной разработки, то вот неполный список факапов из того что могу сейчас вспомнить (я работал с питоном около 2 лет назад): - Миграция с 2->3 и даже само существование модуля six. Это говорит о плохом дизайне языка и планировании его развития. - GIL. Это вообще ахтунг, «успешные проекты» можно писать и без настоящей многопоточности, так? Но зачем? - Memory footprint больше, чем у джавы, а скорость исполнения на порядок ниже. Зачем для чего-то кроме скриптов и домашних страничек пытаться использовать такой неэффективный язык? - Динамическая типизация. Добавление аннотаций только подтверждает, что это является проблемой и причиной багов для многих пользователей.

Если фанатик или просто нравится простота питона то да, смысла спорить немного.

Но то, что питон неэффективный инструмент - это факт чисто с прагматической точки зрения.

Ende
()
Ответ на: комментарий от Ende

«успешные проекты» можно писать и без настоящей многопоточности, так?

Именно так.

Но зачем?

И без этого всё нормально.

Memory footprint больше, чем у джавы

Это ложь.

питон неэффективный инструмент - это факт

Смотря для каких задач.

tailgunner ★★★★★
()
Ответ на: комментарий от Ende

простота питона

Откуда этот бред про простоту? Питон очень сложный, «большой» язык, в котором сложно разбираться, сложно запоминать его. Кроме того, у питона ужасная документация, несмотря на наличие множества страниц на docs.python.org, документация неудобно организована, часто туманна и неполна.

anonymous
()
Ответ на: комментарий от anonymous

Откуда этот бред про простоту?

У Python низкий порог входа.

Питон очень сложный, «большой» язык, в котором сложно разбираться, сложно запоминать его

Что в нем сложного и по сравнению с чем?

tailgunner ★★★★★
()
Ответ на: комментарий от Ende

Пихание многопоточности туда, где она не нужна, говорит о незрелости разработчика.

А аннотации добавлены для того, чтобы использовать статические анализаторы и отлавливать проблемы до продакшена, но при этом не терять скорость в рантайме.

panter_dsd ★★★★
()
Ответ на: комментарий от Ende

Питон, по крайней мере раньше, продавался как «клей» для нативных библиотек. Хочешь поиграться с OpenCV - пожалуйста. Посмотреть что происходит в области AI, распознавание речи - пожалуйста. Это язык который выбираются сейчас ученые для математических расчетов, статистики и прочей big-data хрени. Python афигенен для написания прототипов: прасеры, конвертеры, распознаватели, генераторы - везде где для него есть библиотеки. Тот же Jupiter вспомните.

Проблемы GIL во многих случаях нивелируются запуском отдельных процессов. Нужно многопоточная обработка? Берёте Celery обработка не только многопоточная, но еще и распределенная. Та же Мозила борется с медленностью Python в их вики тупо отдав все медленные операции бэкграунд таскам.

В больших проектах у любого динамического языка начинаются проблемы и Python не исключение. Бонус быстрой разработки нивелируется необходимостью все покрывать тестами. Т.е., если на Java я буду тестировать только нетривиальные алгоритмы, важную бизнес логику и напишу какие-то функциональные тесты, то для приложения на Python желательно бы тестировать каждую ветку исполнения, не дай бог в имени переменной опечатался... но, не каждый проект дорастает до стадии когда написание тестов начинает тормозить проект. Кстати, аннотации типов должны помочь прежде всего не линтером, а auto-completion в IDE.

«memory footprint» в Java может и меньше, но в .Net он еще меньше и в С# есть нормальные generics. Java на свалку? Кстати, стартует небольшое приложение на Python быстрее такого же на Java, а пишется в разы быстрее.

И опять, очень часто годовой-двух годовой проект так и остается прототипом и не взлетает и Python позволяет такие проекты довести до «завершенной» стадии значительно быстрее чем на Java.

anonymous
()
Ответ на: комментарий от RazrFalcon

К сожалению, я мало с чем могу сравнивать (php осваивал в 2000 - сравнивать не буду), но лет 10 назад немного нужно было работать с C#/.Net, так вот осваивался он гораздо лучше, и дело не только в высококачественной коммерческой документации от MS - видимо дело в самом C#. Аналогичные впечатления были от совсем небольших столкновний с Java. В питоне сложно и туго решительно всё, почти всё переусложнено, неинтуитивно, трубет особых усилий чтоб найти, воспринять, усвоить и запомнить. У питона что-то не то с самим языком, со стандартной библиотекой, со всем.

О простоте питона могут говорить только дауны, которые путают сложность и доступность языка с тем, как он дается людям не владеющим программированием вообще. Да наверное, вайтишники и дети быстро воспринимают саму идею программирования через питон. И тем не менее питон чудовищно (неопраданно) сложен и для изучения и для использования, требует, видимо, очень сильных программистов.

anonymous
()
Ответ на: комментарий от anonymous

Во первых, для твоей задачки отладчик не нужен от слова flash player.

Причём тут flash player.

Во вторых, при чём тут питон?

Ну мы как бы его обсуждаем.

Отладчик и статическая типизация - это инструменты для отладки

Когда статическая типизация стала инструментом?

И оба по определению не являются способами.

Обоснуй.

Rodegast ★★★★★
()
Ответ на: Аннотации типов от Laz

Оно доросло до типов? Статический анализ умеет? Можно написать (a -> f b) -> (t a) -> f (t b)?

Конечно нет.

Rodegast ★★★★★
()
Ответ на: комментарий от anonymous

Что конкретно переусложнено? На Python сложнее чем на PHP нарисовать страничку и выложить ее на бесплатный хостинг. И.. как бы все. Это правда, не о самом языке, но не суть. Python - самый «казуальный» из первой 10-ки наиболее используемых языков.

anonymous
()
Ответ на: комментарий от anonymous

Питон, по крайней мере раньше, продавался как «клей» для нативных библиотек

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

Про прототипирование тоже согласен. Но

прасеры, конвертеры, распознаватели, генераторы - везде где для него есть библиотеки

Только вот работают они медленно. Если это все те же библиотеки на C то вопросов нет.

Проблемы GIL во многих случаях нивелируются запуском отдельных процессов

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

Еще раз, быстрое прототипирование - ок. Но это как раз таки говорит об «игрушечности» языка. Проекты на нем быстро пишутся, но работают медленно и со временем появляются проблемы.

Ende
()
Ответ на: комментарий от Ende

Что значит «крутизна»?

Такая штука, которая позволяет понтоваться перед другими детьми.

Это вообще ахтунг, «успешные проекты» можно писать и без настоящей многопоточности, так?

По этому поводу есть старый анекдот времён сухого закона. Приходит Горбачёв на завод и показывают ему самого крутого токаря, который выточил какую-то немыслимую деталь.

Горбачёв: Молодец! Отлично работаете, товарищ. А вот если бы вы стопочку в обед пропустили, вы б так допуски соблюсти не смогли.

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

Горбачёв: Ладно, после двух не смог бы.

Токарь: Смог бы.

Горбачёв: После трёх!

....

Горбачёв: Ну если бы бутылку выпил, точно бы не сделал!

Токарь: Так сделал же!

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Так это, ты если язык почесать хотел то сразу бы сказал, зачем мне вообще тебе по теме отвечать тогда :) Про детей каких-то, анекдоты рассказывать «по этому поводу». Я думал что выйдет конструктивный диалог, ну нет так нет.

Ende
()
Ответ на: комментарий от Ende

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

Другие ядра не простаивают. На них работают другие сервисы и worker-ы. Для распределенных приложений это тоже неважно: если не углубляться в оптимизацию, то хватает и отдельных процессов (Celery и аналоги) - и никакие это не костыли. До тех пор пока проект не испытывает проблем со скоростью обработки и заказчикам хватает платить денег за сервера - не все ли равно однопоточное оно или многопоточное? Скажем, у меня на проекте сейчас важнее, чтобы ffmpeg быстро работал, чем REST севрер и обвязка на Python...

anonymous
()
Ответ на: комментарий от anonymous

Откуда этот бред про простоту? Питон очень сложный

По крайне мере легче, нежели Haskell.

Odalist ★★★★★
()
Ответ на: комментарий от anonymous

Сложный это когда как в плюсах. Питон интуитивный, логичный и легко воспринимаемый. Достаточно прочитать 2 главы про синтаксис любого учебника 1 раз. То, что в нём можно удалять гланды через задницу, совершенно нормально на самом деле.

anonymous
()
Ответ на: комментарий от Rodegast

Причём тут flash player.

flash player - эталонное нинужно из палаты мер и весов.

Ну мы как бы его обсуждаем.

Мы его обсуждали, но ты почему-то ушёл в отладку тредов. Может ты считаешь, что отладка тредов в питоне чем-то отличается от других языков? Я не понял.

Когда статическая типизация стала инструментом?

Со своего рождения статическая типизация была инструментом для поиска ошибок.

Обоснуй.

Инструмент != способ.

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

Пользуйся, всё ещё жду твой вариант.

anonymous
()
Ответ на: комментарий от Ende

Я думал что выйдет конструктивный диалог, ну нет так нет.

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

ugoday ★★★★★
()
Ответ на: комментарий от Ende

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

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Да зачем мне все, я хотя бы одну прошу.

Когда ни одной нету то конечно проще сказать, что «все», хаха. Только это не делает из тебя полезного собеседника. Так, тролль или балабол.

Ende
()
Ответ на: комментарий от tailgunner

Что сложного? Да всё практически. Я даже не знаю, с чего начать, если честно. Тут ведь настаивают на том, что питон очень простой язык.

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

Объявление абстрактных классов (и абстрактных методов). Обычно это просто ключевое слово, модификатор, всё тупо и понятно. В питоне же очевидно какая-то глубокая манипуляция непонятно чем, нетривиальная катавасия. Чтобы эти криптические записи приобрели какой-то смысл (а не просто оставались мутной копипастой), надо, видимо, разбираться в питоней замудреной объектной модели. Для вас это просто? Завидую! Но не считаю, что «питон простой язык».

Хорошо, вот тут сообщением выше обсуждает многопоточность в питоне. По наивности некоторые могут посчитать (и считают), что GIL упрощает, т.е. многие операции становятся безопасными. Например доступ к элементами словаря. Но для этого нужно чтобы внутри самого захватывался этот гил в правильных местах (насколько я себе это понимаю). Однозначных железных ответов в документации я не нашел. В книге к примеру Martelli буквально одна-две строчки мутных осторожных слов. Что указывает на пессимистичные варианты. Т.е. мнений понаписано много, но железного и официального я найти не сумел (может плохо искал!). Правда я заметил, что неясность по данному поводу у многих питонистов, не только у меня. Но один специалист мне сказал, что в питоне небезопасен даже инкремент int'а, и вообще гил защищает только сам питон чтоб не сломался. И я склонен верить в пессимистичный вариант. Вся эта длинная история - претензия и к документации (в первую очередь) питона и к самому питону (тоже в первую очередь). Сложности на пустом месте. Скажите как есть, сразу большими буквами admonition: «даже не думайте, берите локи на всё» и делов-то.

anonymous
()
Ответ на: комментарий от tailgunner

Кроме того, то ли в джаве то ли в сишарпе была какая-то удобная косметика на уровне синтаксиса для синхронизационных примитивов. Точно не помню, но вроде на почти любое имя можно было взять блокировку (т.е. неявно создавались ассоциированные лок-объекты). Было сделано очень красиво и удобно. В питоне такого не нашел. Ну фиг бы да с ними. Но что интересно: мы пишем программу тратя усилия как на обычную многопоточную (берем локи, синхронизируемся...) а получаем почти однопоточную программу из-за GIL. Если бы питон был «простым языком» в нем либо конкурентный доступ был бы синхронизирован автомагически (если такое вообще возможно), либо была нормальная многопоточность (как разумная компенсация). _Язык, в котором полу-однопоточную программу надо писать с тем же вниманием как многопоточную, нельзя назвать «простым»._

Ну или вот. «Простой язык» по моему мнению, наверное, обеспечивает хорошую кроссплатформенность и абстракцию.

fcntl.lockf(app_single_instance_lock_f, fcntl.LOCK_EX | fcntl.LOCK_NB)
Тут два момента: это блокировка per-process или per-thread? Оно будет работать на нелинуксах так же? Пользователь «простого языка» не должен «заморачиваться» такими вещами.

Модули. `logging` - он слишком сложный, какая-то навороченная архитектура. Не покидает ощущение, что у него где-то глобальный стейт. Разобраться и управлять этим невозможно, по нему три гигантских страницы документации, но понятней не становится. Где _простота_-то? А до logbook надо дойти (зато он умеет удобные трюки в многопоточном коде).

`subprocess`. Вроде бы всё на своих местах, но не покидает ощущение _свалки_. Или вот пример: pipe stderr/stdout можно (но об этом кстати не слова) переключить в неблокирующий режим. Что на самом деле нужно и очень полезно. Теперь вопрос: а readline() от этого не сломается? Если бы питон был «простым языком» не возникло бы ни этих проблем ни этих вопросов.

datetime как-то удивил меня сложностью генерации timezone-aware ISO 8601 строки текущего времени. Без взякого гугла удалось разобраться по доке, и получиьт нужную удивительную конструкцию, но показалось неинтуитивным, хотя задача нужная.

Документация у питона просто треш, как можно это отрицать - не понимаю, неужели не видно.

Мне говорили, что С сложнее 150 раз, а C++ в 700 раз. Хорошо, но это не делает питон «простым языком».

anonymous
()
Ответ на: комментарий от RazrFalcon

Сам ты бред. Ты хоть посмотри документацию нормальную. Оглянись. Да что там MS и Sun, даже у php документация гораздо лучше чем у питона. Это факт.

anonymous
()
Ответ на: комментарий от ugoday

Что значит «возьмите любую»? Ты сказал

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

Значит бремя доказательства и поиска таких цитат лежит на тебе, а не на мне. У меня таких цитат не было, а ты их увидел - получается я тебя должен в чем-то переубеждать? С чего бы это?

Ende
()
Ответ на: комментарий от anonymous

Инкремент не атомарен. Ты можешь использовать только атомарные операции безопасно, это везде так. GIL немного про другое.

anonymous
()
Ответ на: комментарий от Ende

Что значит «возьмите любую»?

По-моему, питон как раз для вас. Он простенький и несложный.

Возьмите любую означает, что если все элемента множества S удовлетворяют условию P и вам нужен один элемент s, такой, что P(s) истинно, то вы можете взять любой элемент множества S.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Я неясно изъясняюсь? Хорошо, еще раз напишу:

Бремя доказательства и поиска таких цитат лежит на тебе, а не на мне. У меня таких цитат не было, а ты их увидел - получается я тебя должен в чем-то переубеждать? С чего бы это?

Ende
()
Ответ на: комментарий от Ende

Я неясно изъясняюсь?

Более чем, про вас всё понятно практически сразу.

Бремя доказательства и поиска таких цитат лежит на тебе

Я нашёл. О чём вас уведомил ранее. Впрочем должен внести коррективы, «все ваши сообщения от начала обсуждения до 29.06.2018 15:23:05». Вы удовлетворены?

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Охохо. Уведомляю тебя, школьник, что ты балабол без доказательств. Я это тоже нашел, и представь себе даже могу тебе доказать цитатами.

Туше.

Ende
()
Ответ на: комментарий от Ende

Охохо. Уведомляю тебя, школьник,

У кого чего болит...

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

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

Да. Или тупо не знаешь, что такое множественное наследование и не заморачиваешься.

Объявление абстрактных классов (и абстрактных методов). Обычно это просто ключевое слово, модификатор, всё тупо и понятно. В питоне же очевидно какая-то глубокая манипуляция непонятно чем, нетривиальная катавасия. Чтобы эти криптические записи приобрели какой-то смысл (а не просто оставались мутной копипастой), надо, видимо, разбираться в питоней замудреной объектной модели. Для вас это просто? Завидую! Но не считаю, что «питон простой язык».

Нет. Объявляешь класс с методом. Ключевые слова не нужны. Считаешь их абстрактными, если вообще знаешь такое понятие. А не знаешь - так и фиг с ним. Тупо и понятно.

Хорошо, вот тут сообщением выше обсуждает многопоточность в питоне. По наивности некоторые могут посчитать (и считают), что GIL упрощает, т.е. многие операции становятся безопасными. Например доступ к элементами словаря. Но для этого нужно чтобы внутри самого захватывался этот гил в правильных местах (насколько я себе это понимаю). Однозначных железных ответов в документации я не нашел. В книге к примеру Martelli буквально одна-две строчки мутных осторожных слов. Что указывает на пессимистичные варианты. Т.е. мнений понаписано много, но железного и официального я найти не сумел (может плохо искал!). Правда я заметил, что неясность по данному поводу у многих питонистов, не только у меня. Но один специалист мне сказал, что в питоне небезопасен даже инкремент int'а, и вообще гил защищает только сам питон чтоб не сломался. И я склонен верить в пессимистичный вариант. Вся эта длинная история - претензия и к документации (в первую очередь) питона и к самому питону (тоже в первую очередь). Сложности на пустом месте. Скажите как есть, сразу большими буквами admonition: «даже не думайте, берите локи на всё» и делов-то.

Зависит от имплементации. Доступ к обычному словорю емнип безопасен. У другогой имплементации может не быть. Инкремент инта - это прочитать инт и присвоить новое значение, поэтому нет. А можно не заморачиватся и писать в один поток.

У питона низкий порог вхождения. Тебе не надо понимать какую-то строгую структуру директорий и файлов, ключевые слова, какие-то концепты ооп. Садишься и пишешь. Будешь закапываться в детали - докопаешься до электронов в транзисторах. Магии не бывает.

anonymous
()
Ответ на: комментарий от anonymous

Ну или вот. «Простой язык» по моему мнению, наверное, обеспечивает хорошую кроссплатформенность и абстракцию.

fcntl.lockf(app_single_instance_lock_f, fcntl.LOCK_EX | fcntl.LOCK_NB)

Ты откопал низкоуровневою, платформозависимую фигню. Зачем? Чего бы тебе не взять threading.Lock? Дальше не читал.

anonymous
()
Ответ на: комментарий от anonymous

Считаешь их абстрактными, если вообще знаешь такое понятие

Я кагбэ знаю «такое понятие»

Объявляешь класс с методом. Ключевые слова не нужны.

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

У питона низкий порог вхождения.

Нет, тут говорят же питон «простой язык». Порог входа во что? Он такой же. Он даже выше чем у C#/Javя, я считаю.

Моя теория откуда эти байки про порог входа и простоту:

... why you should pick Python as your first coding language to learn. It's free, easy to learn ...

Корень заблуждения в том, что «питон простой язык» в том, что даунята (причем опытные программисты тоже) видят только слова easy и Python, но не видят всей остальной фразы и распространяют это заблуждение. Наверное детям действительно проще познакомиться с программированием в рамках питона.

Программирую не со вчерашнего дня, и не могу понять, как вышесказанное делает питон простым языком.

anonymous
()
Ответ на: комментарий от anonymous

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

Да. Или тупо не знаешь, что такое множественное наследование и не заморачиваешься.

А я вот соглашусь с 1-м оратором. В 3-м питоне множественное наследование усложнили в пользу Mixin-ов. Теперь родители ищутся не рекурсивно вглубь, а использую линейнизацию, для того что-бы избавиться от ромбов. Чьи-то классы использовать просто, но когда своё начинаешь писать, придется разобраться и это отличается от привычного наследования в С++, например.

Объявляешь класс с методом. Ключевые слова не нужны. Считаешь их абстрактными, если вообще знаешь такое понятие. А не знаешь - так и фиг с ним. Тупо и понятно.

+1

anonymous
()
Ответ на: комментарий от anonymous

Ты откопал низкоуровневою

Это не низкоуровлевое, мальчик. Это часть стандартной библиотеки питона. Вчитайся в имя модуля.

В питоне нет «низкоуровнего» ничего. Ну правда можешь руками лепить структуры в ioctl.

фигню.

Это не фигня и другого варианта решения задачи в питоне нет

платформозависимую

в питоне много чего платформозависимое, только сегодня узнал?

Зачем? Чего бы тебе не взять threading.Lock? Дальше не читал.

Из документации, мальчик. Ты невнимательный и программист из тебя плохой, вчитайся в строку. threading.Lock тут вообще ни при чем. И эти люди мне что-то доказывают еще про языки программирования.

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

Да, не читай.

anonymous
()
Ответ на: комментарий от anonymous

Нет, тут говорят же питон «простой язык». Порог входа во что? Он такой же. Он даже выше чем у C#/Javя, я считаю.

Я тут давеча прочитал введение (больше 100 страниц) к докментации по sbt (Simple/Scala build tool). ПИТОН ВЕСЬ ЦЕЛИКОМ ПРОЩЕ ЧЕМ ОДНА ТОЛЬКО БИЛДЕЛКА К ЭТОЙ НЕСЧАСТНОЙ СКАЛЕ!1!!! Ничего не хочу доказать, просто иллюстрация.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

Объявляешь класс с методом. Ключевые слова не нужны.

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

Реально не нужен было то Python 3. С новым типом наследования иногда все-таки нужен, чтобы избежать исключений в рантайме при вызове super().method() из «левого» класса.

anonymous
()
Ответ на: комментарий от anonymous

Мне кажется это ты путаешь. Я, скажем, могу успешно писать на любом вменяемом языке, если нужно. Значительно менее эффективно, чем в привычном окружении, конечно, но если необходимо в краткие сроки освою на достаточном уровне. В питоне есть практически все те концепции, которые ты ожидаешь найти в любом нормальном языке и он минимально тебя ограничивает. Особенности реализации часто отличаются, это выясняется довольно быстро. С любым другим языком ты точно так же зависишь от особенностей рантайма. И на базовом, однако достаточном для решения многих задач уровне, он нисколько не сложнее lua и подобных.

anonymous
()
Ответ на: комментарий от anonymous

Я кагбэ знаю «такое понятие»

Молодец. А другие не знают. И это не помешает им программировать на питоне. В отличии от жавы или сишарпа.

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

Если это бред, то тебя явно не затруднит сформулировать, зачем тебе в питоне понадобились абстрактные классы. Можно на примере.

Нет, тут говорят же питон «простой язык». Порог входа во что? Он такой же. Он даже выше чем у C#/Javя, я считаю.

Неправильно ты считаешь. Чтобы писать на жаве или сишарпе тебе нужно понимать классы и объекты и методы и статические методы, разбираться с компиляторами, выстрелить себе в ногу сравнением строк по ссылке. И всё это за долго до того, как ты доберёшься до абстрактных классов или, чего доброго, тредов.

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

anonymous
()
Ответ на: комментарий от anonymous

Чтобы писать на жаве или сишарпе тебе нужно понимать классы и объекты и методы и статические методы,

У меня не возникало с этим проблем последние лет 10 как минимум.

зачем тебе в питоне понадобились абстрактные классы. Можно на примере

Я знаю, куда ты меня хочешь втянуть, в конечном итоге в даунске споры про кокококмпозицию, для меня это пройденый этап. Фигу, не ведусь на это.

Всё же ты не доказал мне, что «питон простой язык».

anonymous
()
Ответ на: комментарий от anonymous

Это не низкоуровлевое, мальчик. Это часть стандартной библиотеки питона. Вчитайся в имя модуля.

Это низкоуровневая, платформозависимая функция, девочка. То, что в стандартной библиотеке питона есть под неё враппер, не делает её менее низкоуровневой или платформонезависимой.

В питоне нет «низкоуровнего» ничего. Ну правда можешь руками лепить структуры в ioctl.

Раз могу - значит есть. Перестань писать бессмыслицу.

Это не фигня и другого варианта решения задачи в питоне нет

В стандартной библиотеке нет. Гугл тебе в пальцы.

в питоне много чего платформозависимое, только сегодня узнал?

Нет, я не только сегодня узнал. Из чего ты сделала такой вывод?

Из документации, мальчик. Ты невнимательный и программист из тебя плохой, вчитайся в строку. threading.Lock тут вообще ни при чем. И эти люди мне что-то доказывают еще про языки программирования.

Я может и невнимательный программист, девочка, но таки освоил питон, в отличии от.

Да, не читай.

Хорошо.

anonymous
()
Ответ на: комментарий от anonymous

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

Нет, проблемы у питона. Он переусложнен, чудовищно сложен (чудовищно - от слова неоправдано, без соответствия тому, что он дает и чем является). Он крив, у него ужасная документация.

anonymous
()
Ответ на: комментарий от anonymous

Я может и невнимательный программист, девочка, но таки освоил питон, в отличии от.

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

Я говорю что питон сложный язык, я не ошибаюсь. (При том что я заурядный программист-середнячек и вообще мало сейчас этим занимаюсь.) А у тебя только гонор: ты думаешь, что что-то там освоил, уверен прям. Позорник!

В стандартной библиотеке нет. Гугл тебе в пальцы.

Клоун.

P.S. Совет, тебе мальчик-гуглеровщик: документацию к инструменту держат при себе и ищут по ней локально.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.