LINUX.ORG.RU

Any reason why you are defining your return type? Is this for readability?

 , ,


1

2

Я создал на этом форуме тему о том, что написал на питоне скрипт для загрузки файлов через ssh. Далее стал понемногу развивать его. Меня конечно заклевали... но так же один человек предложил опубликовать свою разработку (если её можно так назвать) на редите, что я и сделал. И там мне задали вопрос, который я написал в заголовке этой темы. И вот что, знаете, я не могу определиться с тем, что мне на него ответить. Может вы мне поможете? Мне вообще не очень близка динамическая типизация и я очень непонимаю, почему я должен обладать навыками телепатии и догадываться, какие типы данных могут попасть, например, в переменную, или лезть в документацию (если таковая к превеликому счастью имеется), чтобы узнать, что возвращает та или иная функция... ну а в противном случае - лезть в кишки функции и копаться-копаться или смотреть на примеры её использования и надеяться на то, что выуженная мною информация окажется полной и приложение не рухнет в произвольный момент в рантайме. Я, чёрт возьми, определяю возвращаемый тип для того, чтобы, ВНЕЗАПНО, знать возвращаемый тип. И я очень рад, что такую штуку, как тайпхинтинг, завезли в питон, она хоть как-то позволяет убрать часть граблей. Но на форуме по питону говорить, что динамическая типизация - говно, как-то не очень дружелюбно, мне кажется.

В чем твой вопрос ? Тебе сказать как «Да» по английски ?

Я ради забавы залез в твой код. Ты же вкурсе что по PEP большими буквами обозначаются константы ? Так ты мало того что их меняешь, так и делаешь это неявно, через global. И еще что-то про читаемость задвигаешь. Ты на JS писал раньше ?

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

Ты на JS писал раньше ?

I've developing some projects on PHP and for simplify my work I've created small python script

но PHP тут не причем - там попытка переопределения константы это fatal error

и использование $GLOBALS - пример плохого кода

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

Ну то, что функция md5 возвращает строку, довольно очевидно, а вот то, что name: str это путь к файлу - уже нет, если бы ты назвал это path было бы понятней.

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

ssh.exec_command('mkdir -p ' + SERVER_DIRECTORY + '/' + name) - нифига не экранируешь. Кстати есть такая штука, как os.path.join.

Вместо listdir и рекурсии можно было бы использовать os.walk.

Как это будет все работать с симлинками?

Зачем это все если есть, например, rsync?

pawnhearts ★★★★★ ()

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

Да нам-то откуда знать, зачем ты это сделал.

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

Я на JS сослался потому что там можно сделать процедуру которая будет использовать this доставаемый из контекста. А том числе может и менять, как следствие - нечитаемый ад, который трудно дебажить.

БТВ, обычно аргументы и возвращаемое значение вообще описывают в докстринге, IDE умеют их показывать

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

Динамическая типизация нужна для того, чтобы потом всё описывать в докстринге?

MetalBeaver ()

Спасибо динамической типизации, иначе я бы так и не узнал для чего мне отладчик. (я бы так написал).

PS. А для лора ты тоже ответы на другом форуме сочиняешь? Или неужто сам пишешь?

d_a ★★★★★ ()

Это сейчас такой тренд, мне решительно непонятный, неприятный и прямо-таки враждебный: «а зачем тебе знать, какого типа у тебя переменная»? Притом не только в питоне, но и как минимум в плюсах. Я с начальником на код-ревью срался, потому что в его коммите было сплошное «ехал auto через auto»

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

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

KillTheCat ★★★★★ ()

def foo(bar: str) -> str: ...

type hints жи.

научись грамотно именовать переменные. например, и дураку будет понятно, что в login(username, password) оба аргументы строки. тоже самое переменная host строка, а port int... ну любой редактор можеттцеплять все необходимое: vscode, например, с расширением anaconda

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

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

Ну так ты скажи чётко и ясно, а зачем тебе это знать, и сраться не надо будет.

anonymous ()

Омг, это твой первый хеллоуворд на петоне чтоли, чего ты так с ним трясёшься?

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

WitcherGeralt ★★ ()

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

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

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

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

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

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

Зачем его валидировать? То, что ты ввёл в конфиге, - это твои проблемы. Ты полностью это контролируешь. Это же не сторонние данные, которые нужно проверять.

MetalBeaver ()

Может вы мне поможете?

я не могу понять к чему относится вопрос «Any reason why you are defining your return type? Is this for readability?»

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

Алгебра немного похожа на класс в ООП, там тоже множество элементов и операции, но нету наследования и все данные приватные, только операции публичные. Алгебра головного мозга (мне) ещё не создавала проблем в разработке.

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

Обычно на пароль есть ограничения.

И что? Если что-то с ним будет не так, клиент просто не сможет законтачиться к серверу.

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

Алгебра головного мозга (мне) ещё не создавала проблем в разработке.

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

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

Ну да, потому что конструктор типа Password выбросит исключение, или что там в том языке... А если там стринг, то этот пароль может где-то уже сохраниться и вообще все выйдет из под контроля. Имея тип Password, который создается сразу за пользовательским вводом, у тебя всегда и везде будет валидный пароль. Также, везде будет понятно пароль это или другая строка. Хорошо когда переменная с паролем одна и она всегда называется password, но бывает их несколько.

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

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

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

Скажи мне, пожалуйста, две вещи:

1. Какие ограничения на пароль есть у ssh.

2. Зачем нужен класс для валидации, когда это всё можно сделать одной функцией?

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

Но использовать низкоуровневые типы в бизнес логике?

Если в бизнес-логике у нас N яблок, я не вижу смысла городить класс ApplesCount. Максимум, что можно сделать, - проверку на N >= 0.

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

1. Не знаю.

2. Так в том классе и будет ровно одна функция. Смотри, написал ты функцию

String validate_password(String maybe_invalid) {
    ...
}

Но у тебя остался стринг. И ты такой его всюду передаешь.

void foo_func(int some, String pw) { ... }

void bar_func(String pw) { ... }

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

Если же функция принимает Password, все становится понятно.

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

К счастью есть беззнаковые типы, там и такого не нужно.

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

Как фронтендщики без этого живут - загадка. Еще можно во всех элементах интерфейса принимать только LocalizedString вместо String. И зразу навсегда убрать проверки правильная ли локализация, или нет.

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

Не понял, к чему это? Где я показывал самомнение? Будто с ботом общаюсь: «KISS», «мышление ограниченно»... еще бы написал «сам дурак».

Естественно ограниченно. Хотел бы я поговорить с человеком мышление которого не ограниченно.

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

я изначально начинал 10 лет назад с Python/PHP, поэтому динамическая типизация мне никогда не мешала. Я по мелочи писал на C++, C#, Go восторга у меня «статическая» типизация не вызвала. И честно говоря ваших проблем не понимаю от слова СОВСЕМ.

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

Я здесь топил не за статическую типизацию, а за просто типизацию, любую. Ну ладно, просто особенности мышления у нас разные.

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

Ты полностью прав, но динамомакакам этого не объяснить.

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

Даже если б это было так — что, нет других языков?

Если хочешь типы (что правильно) — возьми язык с типами.

Miguel ★★★★★ ()

Но на форуме по питону говорить, что динамическая типизация - говно, как-то не очень дружелюбно, мне кажется.

Нахер нам твой питоноскрипт с reddit'ом. Сделай лучше тред «Динамическая типизация в пистоне не нужна» и поясни почему. 500+ комментариев будет точно.

crutch_master ★★★★★ ()

Один раз я факапнулся и возвращал объект в мультипотоке (объект возвращал свойство копированием другим методом). Работало всё очень хорошо и приятно, но память быстро вытекала гигабайтами, пришлось натравить type везде, где можно. Вряд ли твой способ помог бы мне.

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

Даже если б это было так — что, нет других языков?

Если хочешь типы (что правильно) — возьми язык с типами.

Гм…

написал на питоне скрипт для загрузки файлов через ssh

Это не выглядит задачей, для решения которой необходим язык с типами. Тут и типов-то особых не нужно выдумывать. А то, что ТС захотел аннотаций типов понаставить (как я понял) — ну, нехай приобщается.

А вообще ты тролльнул, а я ответил в том же духе.

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

позовите когда ТС заведёт шарманку «изучение Питона и агрессия в мой адрес подорвали мои душевные силы, скиньте мне денег!»

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

Шо там за языки без типов у вас? Кажется везде есть средства для их определения. Это программа может быть «без типов», а не йазыг. Ваш кэп.

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

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

Динамические ЯП проверяют типы в рантайме, поэтому на них легко можно написать программу, некорректную с точки зрения типов:

def sum(a, b):
    return a + b

sum(func_returns_int(), func_returns_string())
Эта программа может упасть при запуске, а может упасть и через 100500 часов работы — никаких гарантий, что кодер по невнимательности не сложит яблоки с апельсинами нет.

Это программа может быть «без типов», а не йазыг.

Мысленно я тебе аплодирую.

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

Динамические ЯП проверяют типы в рантайме, поэтому на них легко можно написать программу, некорректную с точки зрения типов

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

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