LINUX.ORG.RU
ФорумTalks

Ненависть: не люблю Python

 ,


1

4

Как люди программируют на этом языке? ППЦ

По роду деятельности приходится изучать это и после Perl такая тоска накатывает шоппц.

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

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

В нем есть такой вот блок, определяющий подключенные мониторы и их конфиг:

#!/usr/bin/perl

use 5.20.0;
use YAML;

my %list;
open my $fh, '-|', '/usr/bin/xrandr';
while(<$fh>) {
    if (/^(\S+)\sconnected\s+(primary\s+)?(\d+)x(\d+)([+-]\d+)([+-]\d+)/) {
        $list{$1} = {
            name        => $1,
            w           => $3,
            h           => $4,
            x           => int($5),
            y           => int($6),
            primary     => $2 ? 1 : 0
        }
    }
}

print YAML::Dump \%list;

Запускаем - рассказывает о подключенных мониторах в машиночитаемом виде:

---
DP-1:
  h: 1440
  name: DP-1
  primary: 0
  w: 2560
  x: 2560
  y: 0
DP-2-1:
  h: 1440
  name: DP-2-1
  primary: 0
  w: 2560
  x: 0
  y: 0
eDP-1:
  h: 1080
  name: eDP-1
  primary: 1
  w: 1920
  x: 1280
  y: 1440

вроде что может быть проще?

Однако пытаемся переписать это на python и натыкаемся:

  1. что open - не умеет работать с пайпами
  2. что про пайпы велосипедят 100500 модулей
  3. что у строк есть 100500 методов, но работа с регекспами вынесена в какой-то ужасно сдизайненный модуль `re`
  4. что эти 20 строк кода на Python превратятся в 200

и как вы с этим живете, мозахисты?

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

x и y могут быть с префиксами + и -

rsync ★★
() автор топика
Ответ на: 200 строк от Deleted

Write Only. ППЦ

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

use 5.20.0

что это?

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

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

каждая новая версия - новый синтаксис и новый подход. ППЦ

subprocess это библиотека. И это не «ППЦ», а изменение API (и то если check_output пометили устаревшим, в противном случае никто не мешает им пользоваться и дальше).

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

И это не «ППЦ», а изменение API

изменение API это всегда ППЦ

rsync ★★
() автор топика

Вот еще что напрягает в Python

  1. отсутствие инструментов работы с кодом (perldoc)
  2. отсюда крайняя геморройность изучения просмотра что какой модуль делает

вообще язык, который не заботится о документировании кода - язык ацтойнейший

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

что эти 20 строк кода на Python превратятся в 200

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

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

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

вебовый фронтенд на нём пилить неудобно.

и это неудобство, кстати, растет из за идиотской системы «отступов»

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

Любой язык с нестрогой типизацией это плохо.

разве у перла нестрогая типизация?

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

Virtuos86 ★★★★★
()
Ответ на: Вот еще что напрягает в Python от rsync

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

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

Потому, что ты не прочёл о том, что match ищет совпадения в начале строки и тебе нужен re.search

grem ★★★★★
()
Ответ на: Вот еще что напрягает в Python от rsync
  • отсутствие инструментов работы с кодом (perldoc)
  • отсюда крайняя геморройность изучения просмотра что какой модуль делает

вообще язык, который не заботится о документировании кода - язык ацтойнейший

Сделай, например

$ python
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = []
>>> help(foo)
У питоньих объектов есть даже поле __doc__, в котором принято размещать доку к объекту.

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

В питоне есть интроспекция и всё обтыкано докстрингами, даже никакой пердок не нужен

конечно не нужен.

пользователю же в голову не придет необходимость посмотреть документацию по например модулю subprocess, ага

идите на сайт и читайте

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

Сделай, например help(foo)

так я об этом и говорю!

там где в нормальных языках пишут одну команду perldoc foo в питоне пишут две-три команды:

python
help(open)

или

python
import subprocess
help(subprocess)

Python любую работу умножает на два, а иногда на три!

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

и это неудобство, кстати, растет из за идиотской системы «отступов»

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

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

А ниже не подойдёт даже если фич той что выше нет?

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

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

python-embedded шаблоны невозможны именно по причине отступов.

JS-embedded возможен, Perl-embedded возможен,

даже теоретически C++-ембеддед шаблонизатор возможен, а вот питон - нет

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

perldoc - это не только утилита, это еще и язык разметки документаци кода

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

python-embedded шаблоны невозможны именно по причине отступов.

вот фигня, а я-то не знал. с завтрашнего дня выпилю из своего рабочего проекта mako, раз какой-то неуч с ЛОРа сказал, что так нельзя.

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

с завтрашнего дня выпилю из своего рабочего проекта mako

Вот в этом Мако - пример извращения, прямо связанный с отступами:

https://docs.makotemplates.org/en/latest/syntax.html#python-blocks

прямо в их документации

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

While the code can appear with an arbitrary level of preceding whitespace, it has to be consistently formatted with itself. Mako’s compiler will adjust the block of Python to be consistent with the surrounding generated Python code.

Куда уж лучше-то?

t184256 ★★★★★
()
Ответ на: 200 строк от Deleted

я бы переписал код ТС так:

#!/usr/bin/perl

use YAML;

open my $fh, '-|', '/usr/bin/xrandr';
while(<$fh>) {
    next unless /^(\S+)\sconnected\s+(primary\s+)?(\d+)x(\d+)[+-](\d+)[+-](\d+)/;
    $list{$1} = { name, $1, w, $3, h, $4, x, $5, 'y', $6, primary, $2 ? 1 : 0 }
}

print YAML::Dump \%list;

11 строк вместо 25, вау. А если 1к вместо 2.5к? А если 3к вместо 6.5к?))

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

Вижу, но без этого если и выйдет, то тогда ты будешь ныть про неочевидность правил. Куда уж лучше-то?

И да, капец ты неосилятор если дальше синтаксиса не видишь. Нормальному программисту синтаксис не жмет... хотя ты на перловке вырос, может тебе жмет синтаксис как концепция?..

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

Вижу, но без этого если и выйдет, то тогда ты будешь ныть про неочевидность правил. Куда уж лучше-то?

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

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

Нормальному программисту синтаксис не жмет...

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

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

что ущербно-изначально принятая парадигма значимости пробелов

из твоего синдрома утенка этого не следует.

теперь заставляет костылить там-сям

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

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

Нет, чтобы переписать на вызовы соответствующей либы

systemd я тоже ненавижу

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

ну хоть про невозможность перестал гнать

дык введенные доп-операторы и говорят о невозможности!

вон твой пример подтверждает мой тезис: невозможно

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

Убираем ямл и хэш:

#!/usr/bin/perl -l

open my $fh, '-|', '/usr/bin/xrandr';
while(<$fh>) {
    next unless /^(\S+)\sconnected\s+(primary\s+)?(\d+)x(\d+)[+-](\d+)[+-](\d+)/;
    print join("\n\t", "$1", "name: $1", "w: $3", "h: $4", "x: $5", "y: $6", "primary: @{[ $2 ? 1 : 0 ]}");
}
Deleted
()
Ответ на: комментарий от Deleted

и в чём проблема? Понятно, что питонистам это сложно. Но перловики на этом не споткнутся даже.

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

а в чем говнокод? Это естественное поведение: запятые равнозначны =>. Убрал для краткости.

Deleted
()

Мод-кун, сделай s/ненависти тред/наркомании тред/

MrClon ★★★★★
()

что эти 20 строк кода на Python превратятся в 200

Ога, все помним программу из одной строчки на Perl.

А на C вообще можно хоть всё ядро linux уместить в одну строчку гигантской длины, если не ошибаюсь.

te111011010
()
Ответ на: 200 строк от Deleted
#!/usr/bin/env python3
import re
import subprocess
import yaml

res = {}
out = subprocess.check_output(["xrandr"], universal_newlines=True)
match = re.search(
            r"^(\S+)\sconnected\s+(primary\s+)?(\d+)x(\d+)([+-]\d+)([+-]\d+)",
            out, re.MULTILINE)
if match:
    res[match[1]] = {
        "name"    : match[1],
        "w"       : int(match[3]),
        "h"       : int(match[4]),
        "x"       : int(match[5]),
        "y"       : int(match[6]),
        "primary" : 1 if match[2] else 0,
    }

print(yaml.dump(res, default_flow_style=False), end="")

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

Darth_Revan ★★★★★
()
Последнее исправление: Darth_Revan (всего исправлений: 1)

Как я тебя понимаю. Ненавижу питоновых говнокодеров.

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