LINUX.ORG.RU
ФорумTalks

Питон здорового человека

 ,


1

3

Ahoi!

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

Есть ли в ассортименте языков что-то подходящее под кейсы использования этого питона, но со строгой типизацией, адекватным синтаксисом и форматированием не как в убогом VB?

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


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

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

А сейчас я ожидаю чтобы мне тут дали определение, что же такое эта мифическая «строгая типизация».

Переменным определенного типа нельзя присваивать значения другого типа? Нет, можно. Выше ыл пример на расте, где это называется shadowing. В питоне (с якобы строгой типизацией) тоже можно.

Нельзя совершать арифметические операции со значениями разных типов? Нет, можно. Потому что арифметические операции ничем не отличаются от любых других. В питоне можно умножать числа на строки. В Java и C# можно складывать числа со строками.

Так что такое «строгая типизация», о которой только дураки не знают?

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

Для меня python и php делят первое место в списке отвратительного дизайна языка. И на обоих я писал достаточно.

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

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

Ты хочешь строгую статическую типизацию.

mypy это и есть инструмент для проверки статической типизации.

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

На человеческом языке это называется «двойные стандарты»

no-dashi-v2 ★★★
()
Ответ на: комментарий от javascript

Так что такое «строгая типизация», о которой только дураки не знают?

Это когда в ЯП нет implicit type conversion.

Вот только в питоне она есть. Снова упс.

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

Интерпретация true и false в if зависит от фазы луны?

Во втором питоне сам знаешь, True был 1, False был 0. И вся интерпретация заключалась в том, знаешь ты это или нет.

Операции с числами во всех ЯП имеют нюансы, питон не исключение.

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

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

Так и в js операция (object * object) - это вызов метода. Дальше что?

Попробуй умножить на float, что, работает?

Попробуй js сложить число и bigint, что работает? Или js язык со строгой типизацией?

А определение строгости типизации читай в википедии.

То есть ты не знаешь этого определения?

javascript
()
Последнее исправление: javascript (всего исправлений: 1)
Ответ на: комментарий от wandrien

В Java и С# можно складывать числа и строки. Без явного приведения. В руби, кстати, тоже можно умножать строки на числа.

Они языки не со строгой системой типов?

javascript
()
Последнее исправление: javascript (всего исправлений: 1)
Ответ на: комментарий от javascript

Хорошо, уточню. В питоне есть переопределение операторов. В питоне «+» и «*» это не исключительно арифметические операторы. Тыкать пальцем и кричать «фу» можно. Дальше что?

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

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

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

В js есть переопределение мета-алгоритмов приведения одних типов к другим при разных условиях, с помощью которых осуществялется перегрузка работы операторов.

Этого достаточно, чтобы считать js языком со строгой типизацией?

javascript
()
Последнее исправление: javascript (всего исправлений: 2)
Ответ на: комментарий от thesis

Powershell, разумеется.

божишь просто) аффтару два укола павершеллом в голову.

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

какая живеем. Это полупокерное поделие на язык не нужно. Говори прямо тебе С или питон? К чему эти полумеры соевые

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

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

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

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

То же самое можно о любом скриптовом ЯП сказать. Чтобы наговнокодить автоматизацию, годится почти что угодно. Но зато потом, когда оно начинает падать на специфических кейсах, придётся таки учить язык. Любой.

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

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

последовательность выполнения вообще зависит от последовательности написания

Смотря что и где написано. В данном конкретном случае это такая а ля «монада», а последовательное исполнение это фича монад.

no-such-file ★★★★★
()
Ответ на: комментарий от javascript

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

Этого достаточно, чтобы считать js языком со строгой типизацией?

Чего? Если в Джаваскрипте можно


alert(1 + "1");

то нет.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Ты не отвечаешь на вопросы, а только шлангуешь.

Ответь хотя бы, чем оператор сложения в твоем представлении отличается от оператора умножения.

Почему в питоне делать 1 * '1' - это норм, это строгая типизация. А если в js 1 + '1' - то это не норм, это нестрогая.

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

javascript
()
Последнее исправление: javascript (всего исправлений: 2)
Ответ на: комментарий от javascript

На человека повлиял губительно Rust, ответ: четкой границы нету.

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

ни про работу с памятью, ни про сборщики мусора, ни про виртуальные машины для исполнения байткода.

Так все хардкорные питанисты знают по GIL, и про то какие реализации Python существуют. Это как кодеры на Java и C# которые знают про промежуточное представление в байткоде и про работу GC.

Мне в python не нравится его нарочитая процедурность. Все эти обязательные self. для доступа к членам класса, обязательные декларирование ссылки в методе класса первым аргументом. Как будто ООП для python не родной, и его только что добавили в процедурный язык. В GO и Rust тоже самое, но их не называют объект-ориентированными, совершенно другие подходы к проектированию, наследования нет, эксепшенов тоже.

Мне реализацию ООП в python напоминает EcmaScript3, когда на нем косплеили ООП. Я не говорю что Python ужасен, но он выглядит старым языком, как и PL/SQL, пишешь и думаешь про себя – «все ок, не нервничай, представь что ты оказался в 93 году!» :)
Ну а BASH настолько плох, что это даже становится хорошо, особый способ доставить себе удовольствие, в руках плетка, во рту кляп :)

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

Шланг тут только ты, с уважением.

Почему в питоне делать 1 * ‘1’ - это норм, это строгая типизация. А если в js 1 + ‘1’ - то это не норм, это нестрогая.

Потому что конкатенация подразумевает, что в ней участвуют две строки. А числовое сложение – что два числа. А куда относится 1 + "1"? Это конкатенация строк или сложение чисел?

А в "1" * 1 слева строка, справа число – всё как надо. Кстати, 1 * "1" невалидно.

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

А числовое сложение – что два числа

А умножение это не два числа?

Кстати, 1 * «1» невалидно.

Уверен? Проверить не хочешь?

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

А умножение строки на число что подразумевает?

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

wandrien ★★
()

Lua, ruby. Касательно строгой типизации можно взять модификации упомянутых языков со строгой типизацией(nelua-lang, terralang, teal-lang, аналогичные штуки можно поискать для руби). С извращениями можно использовать даже go и даже сишку(с помощью tcc), хотя наткнёшься на кучу косяков, типо невосприятия #! и возьмёй с библиотеками.

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

Кстати, 1 * "1" невалидно.

$ python
Python 3.10.10 (main, Mar  5 2023, 22:26:53) [GCC 12.2.1 20230201] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 * "5"
'55'
>>> 

Любители питона все такие?

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

А умножение это не два числа?

Я выше одному человеку объяснял, что в питоне использовано переопределение операторов для некоторых операций над базовыми типами. Я, к сожалению, не знаю корректного термина, чтобы обозвать «умножение» строки (мультипликация?). По факту это операция не умножение, но приходится так ее называть. Но бедные дурачки вцепились мертвой хваткой в астерикс и не отпускают…

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

Почему в питоне переопределенная операция это норм, а в js - не норм?

Ты в итоге можешь дать четкое определение строгой типизации, в непонимании которой выше ты обвинял @shell-script, чтобы мы тут все прочли и как поняли, что да - вот питон - строгий, а js нестрогий. Иначе получается, что пока разницы нет никакой.

javascript
()
Последнее исправление: javascript (всего исправлений: 2)
Ответ на: комментарий от javascript

Потому что оператор * с двумя аргументами int и str определён — он дублирует строку str int раз и возвращает строку. Преобразования типов не происходит. Для двух строк, например, * выдаст ошибку, потому что это не имеет смысла. + наоборот для двух строк определён — это конкат, а для строки и числа — нет. В JS происходит совсем другое — там типы приводятся к одному, причём строка неявно преобразуется в число.

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

пишешь и думаешь про себя

ЯП для чего придумали?
Для упрощения разработки алгоритмов.
Пока не разработают ЯП, которые понимают чем полезны «базы знаний», будем по старинке использовать а-ля Алгол-60.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Вот это я поржал канеш. Чувак опозорился с незнанием питона и с горя заигнорил того, кто ему на это указал. А ЧСВ-то сколько было, ё-моё.

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

а в js - не норм?

В JS тоже норм. Только в примере нет никакой переопределённой операции, там есть неявное преобразование типов. Это, мягко говоря, две большие разницы (или четыре маленьких).

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

Потому что оператор * с двумя аргументами int и str определён — он дублирует строку str int раз и возвращает строку. Преобразования типов не происходит.

«Какая эндюзеру разница, сделано оно через вызов метода или конверсию типа, если результат одинаковый.»

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

Что смешного в том, что тебе указали на фактическую ошибку (хотя конкретно к изначальному тезису она отношения и не имеет)?

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

В JS происходит совсем другое — там типы приводятся к одному, причём строка неявно преобразуется в число.

Нет. При сложении строки и числа - строка к числу не приводится. Возвращается новая строка.

Как и в Java и C# - языках со строгой типизацией.

Так в чем разница?

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

Потому что конкатенация подразумевает, что в ней участвуют две строки. А числовое сложение – что два числа. А куда относится 1 + «1»? Это конкатенация строк или сложение чисел?

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

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

«Какая эндюзеру разница, сделано оно через вызов метода или конверсию типа, если результат одинаковый.»

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

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

А куда относится 1 + «1»? Это конкатенация строк или сложение чисел?

1 + '1' в js вернет строку '11'. Это поведение описано в стандарте js, ровно так же как описана операция умножения над строкой и числом в питоне.

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

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

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

Тут у людей проблемы с отличием строгой типизации от нестрогой. И почему-то с какими-то норм и ненорм.

Это не у людей проблемы. Это у термина проблемы. Термин на самом деле никакого чёткого деления языков не подразумевает, нет однозначных критериев.

В отличие от понятия динамической/статической типизации, где как раз всё вполне однозначно.

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

Ну, преобразуется. Согласно стандарту этого языка. Это делает язык нестрогим?

Сложение bool с числом в питоне что даст?

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

Это поведение описано в стандарте js

Там описано, почему я должен считать языком со строгой типизации язык, который конкатенирует число к строке, хотя число это явно же не строка?

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

Там описано, почему я должен считать языком со строгой типизации язык, который конкатенирует число к строке, хотя число это явно же не строка?

Жесть, какой мрак в голове. Тут не Rust-ом ударило, как выше писали. Тут что-то химическое.

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

Это поведение описано в стандарте js, ровно так же как описана операция умножения над строкой и числом в питоне.

Нет, в стандарте описано, как приводятся типы. Это и есть нестрогая типизация, заявленная в стандарте. Я не знаю, зачем привели конкатенацию, если есть пример проще:

'1' == 1  # true

Здесь наглядно показано неявное преобразование типов. При конкатенации строки и числа происходит такое же неявное преобразование типов, после чего две строки (одна сразу была, другая сделана из числа) объединяются.

Я только пришёл, не следил за началом, и кто там говорил, норм это или не норм. Но это именно нестрогая типизация, и она так же «норм», а и строгая — это дело вкуса. Но понимать, чем одна от другой отличается (неявным преобразованием типов) необходимо.

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

«Название языка со строгой типизацией не должно начинаться на джава- и заканчиваться на -скрипт» – годится?

Virtuos86 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)